Java多線程實現窗口背景顏色輪換(synchronize加鎖)

最近學校請外面老師來上課,給我們鞏固了一些Java基礎,並寫了這個多線程實現窗口輪換背景,我加了wait()和notifyAll()方法。不過時間延遲上有一點點問題,希望與大家共勉,以下是貼的代碼:

package com.ex;
import java.awt.Color;


import javax.swing.JFrame;
import javax.swing.JPanel;
public class PrintColor extends JFrame{
	
	private static JPanel panel;
	private static boolean b;
 
	public PrintColor(){
		this.setBounds(200, 200, 200, 200);
		this.setTitle("我是窗口");
		b = false;
		panel = (JPanel) this.getContentPane();
		//panel.setBackground(Color.GREEN);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final PrintColor printColor = new PrintColor();
		//Thread thread = new Thread(printColor);
		//thread.start();
		
		new Thread(new Runnable(){
			@Override
			public void run() {
				// TODO Auto-generated method stub
				while(true){
					synchronized (printColor) {
						if(!b){
							try {
								printColor.wait();
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
						panel.setBackground(Color.GREEN);
						System.out.println(Thread.currentThread().getName());
						b = true;
						printColor.notifyAll();
					}
				}
			}
			
		}).start();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				while(true){
					synchronized (printColor) {
						if(b){
							try {
								printColor.wait();
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
						panel.setBackground(Color.RED);
						System.out.println(Thread.currentThread().getName());
						b = false;
						printColor.notifyAll();
					}
				
				}
			}
		}).start();
	
		printColor.setVisible(true);
	}
ps:整理自己所寫的代碼真的很重要。活到老學到老吧!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章