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

📄 randomcharacters.java

📁 金旭亮的java教案
💻 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 + -