📄 multithreaddemo4.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 + -