📄 randomcharacters.java
字号:
// Fig. 15.7: RandomCharacters.java
// Demonstrating the Runnableinterface
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RandomCharacters extends JApplet
implements Runnable,//实现线程接口
ActionListener {
private String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private JLabel outputs[];
private JCheckBox checkboxes[];
private final static int SIZE = 3; //拥有三个线程
private Thread threads[]; //线程数组
private boolean suspended[]; //线程是否被挂起?
public void init()
{
//创建界面
outputs = new JLabel[ SIZE ];
checkboxes = new JCheckBox[ SIZE ];
//创建线程数组
threads = new Thread[ SIZE ];
suspended = new boolean[ SIZE ];
Container c = getContentPane();
c.setLayout( new GridLayout( SIZE, 2, 5, 5 ) );
for ( int i = 0; i < SIZE; i++ ) {
//添加标签
outputs[ i ] = new JLabel();
outputs[ i ].setBackground( Color.green );
outputs[ i ].setOpaque( true );
c.add( outputs[ i ] );
//添加复选框
checkboxes[ i ] = new JCheckBox( "Suspended" );
checkboxes[ i ].addActionListener( this );
c.add( checkboxes[ i ] );
}
}
//当浏览器重新装入此页面时,调用此过程
public void start()
{
// create threads and start every time start is called
for ( int i = 0; i < threads.length; i++ ) {
//创建线程对象
threads[ i ] =
new Thread( this, "Thread " + (i + 1) );//this 是一个Runable对象
//启动每个线程
threads[ i ].start();
}
}
//多线程执行的语句
public void run()
{
Thread currentThread = Thread.currentThread();//获取当前线程
int index = getIndex( currentThread ); //获取当前线程在数组中的索引
char displayChar;
while ( threads[ index ] == currentThread )
{
try {
// 随机休眠
Thread.sleep( (int) ( Math.random() * 1000 ) );
//醒了,注意,这时当前线程可能被改变
synchronized( this ) //this指网页本身
{
while ( suspended[ index ] //如果"我"被挂起了
)
wait();//让出锁
//后面的代码等待用户点击标签后并调用Notify()方法唤醒
//后再执行
}
}
catch ( InterruptedException e ) {
System.err.println( "sleep interrupted" );
}
//随机生成26个字母中的一个
displayChar = alphabet.charAt(
(int) ( Math.random() * 26 ) );
//将字母显示出来
outputs[ index ].setText( currentThread.getName() +
": " + displayChar );
}
System.err.println(
currentThread.getName() + " terminating" );
}
//获取线程的索引
private int getIndex( Thread current )
{
for ( int i = 0; i < threads.length; i++ )
if ( current == threads[ i ] )
return i;
return -1;
}
//用户访问其它网页,此方法被调用
public synchronized void stop()
{
// stop threads every time stop is called
// as the user browses another Web page
for ( int i = 0; i < threads.length; i++ )
threads[ i ] = null;
// make all waiting threads ready to execute, so they
// can terminate themselves
notifyAll();
}
public synchronized void actionPerformed( ActionEvent e )
{
for ( int i = 0; i < checkboxes.length; i++ ) {
if ( e.getSource() == checkboxes[ i ] ) {
suspended[ i ] = !suspended[ i ];//切换挂起标记
//设置标签背景
outputs[ i ].setBackground(
!suspended[ i ] ? Color.green : Color.red );
// if thread resumed, make sure it starts executing
if ( !suspended[ i ] )//如果没有被挂起
notifyAll();
return;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -