⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multithreaddemo4.java

📁 java程序设计语言源代码
💻 JAVA
字号:
//Example 4 of Chapter 8

import java.awt.*;
import javax.swing.*;

public class MultiThreadDemo4 extends JFrame
{
	private ScrollPane scrollPane;
	private JTextArea area;
	
	public MultiThreadDemo4()
	{
		super( "线程同步演示" );
		getContentPane().setLayout( new BorderLayout() );
		scrollPane = new ScrollPane();
		area = new JTextArea();
		area.setEditable( false );
		scrollPane.add( area );
		getContentPane().add( scrollPane, BorderLayout.CENTER );
		
		DataProcesse dataprocesser = new DataProcesse();
		Provider provider = new Provider( dataprocesser );
		Comparer comparer = new Comparer( dataprocesser );
		provider.start();
		comparer.start();
		
		setSize( 240, 400 );
		setVisible( true );
	}
	
	public static void main(String[] args)
	{
		MultiThreadDemo4 demo = new MultiThreadDemo4();
		demo.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	}
	
	private class Provider extends Thread
	{
		private DataProcesse processer;
		public Provider( DataProcesse dp )
		{
			super( "提供者" );
			processer = dp;
		}
		
		public void run()
		{
			for ( int i = 0; i <= 4; i++ )
			{
				processer.set( i );
			}
			area.append( getName() + "提供完数据\n" );
		}
	}
	
	private class Comparer extends Thread
	{
		private DataProcesse processer;
		public Comparer( DataProcesse dp )
		{
			super( "处理者" );
			processer = dp;
		}
		
		public void run()
		{
			double sum = -30.0;
			for ( int i = 0; i <= 4; i++ )
			{
				double a = processer.get();
				if(sum < a)sum = a;
			}
			area.append( getName() + "读到的最大数据是" + sum + "\n" );
		}
	}
	
	class DataProcesse
	{
		private double buffer;
	private boolean flag = false;
		public synchronized void set( double value )
		{
			notifyAll();
			while ( flag == true )
			{
				try{
				area.append( "缓存中有数据," + Thread.currentThread().getName() + "等待\n" );
				wait();
				}
				catch ( InterruptedException exception )
				{
					exception.printStackTrace();
				}
			}
			buffer = value;
			flag = true;
			area.append( Thread.currentThread().getName() + "写入" + buffer + "\n" );
			notify();
		}
		
		public synchronized double get()
		{
			notifyAll();
			while ( flag == false )
			{
				try{
				area.append( "缓存中无新数据," + Thread.currentThread().getName() + "等待\n" );
				wait();
				}
				catch ( InterruptedException exception )
				{
					exception.printStackTrace();
				}
			}
			flag = false;
			area.append( Thread.currentThread().getName() + "读出" + buffer + "\n" );
			notify();
			return buffer;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -