多线程实现红绿灯循环亮

定义三个线程,一个控制红灯,使其亮5秒,一个控制黄灯使其亮2秒,一个控制绿灯使其亮4秒,按照顺序循环交替进行

import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import javax.swing.*;

public class TestThread extends JFrame{
    private Thread thread1;
    private Thread thread2;
    private Thread thread3;    
    final Lock l = new ReentrantLock();
     private static int state = 0; 

    public TestThread() {
        //红灯亮5秒
        thread1 = new Thread(new Runnable() {        
            @Override
            public void run() {    
                while(state>-1) {
                    l.lock();
                    if(state%3==0) {
                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Graphics graphics =getGraphics();
                        Graphics2D graphics2d = (Graphics2D) graphics;                                
                        Shape shape = new Ellipse2D.Double(30,60,100,100);    
                        graphics.setColor(Color.red);
                        graphics2d.fill(shape);        
                        
                        try {
                            Thread.sleep(5000);
                        } catch (InterruptedException e) {                        
                            e.printStackTrace();
                        }
                        graphics.clearRect(30, 60, 100, 100);
                        state++;
                    }
                        
                    l.unlock();
                }
                
                }                                
        });        
        //黄灯亮2秒
        thread2 = new Thread(new Runnable() {        
            @Override
            public void run() {        
                while(state>-1) {
                    l.lock();
                    if(state%3==1) {
                        try {
                            Thread.sleep(0);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Graphics graphics =getGraphics();
                        Graphics2D graphics2d = (Graphics2D) graphics;                                                                                                
                        Shape shape1 = new Ellipse2D.Double(180,60,100,100);    
                        graphics.setColor(Color.yellow);
                        graphics2d.fill(shape1);    
                        
                        try {
                            Thread.sleep(2000);//等待2秒
                        } catch (InterruptedException e) {
                            // TODO 自动生成的 catch 块
                            e.printStackTrace();
                        }
                        graphics.clearRect(180, 60, 100, 100);//清除
                        state++;
                    }                    
                    l.unlock();
                }
                
                }                                
        });
        //路灯亮4秒
        thread3 = new Thread(new Runnable() {        
            @Override
            public void run() {        
                while(state>-1) {
                    l.lock();
                    if(state%3==2) {
                        try {
                            Thread.sleep(0);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Graphics graphics =getGraphics();
                        Graphics2D graphics2d = (Graphics2D) graphics;                                                    
                        Shape shape2 = new Ellipse2D.Double(330,60,100,100);//设置圆的位置    
                        graphics.setColor(Color.green);//颜色
                        graphics2d.fill(shape2);//填充
                        
                        try {
                            Thread.sleep(3500);        
                            
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        graphics.clearRect(330, 60, 100, 100);    //清除圆
                        state++;
                    }                    
                    l.unlock();
                }                                    
                }                                
        });        
        //启动线程
            thread1.start();
            thread2.start();
            thread3.start();

    }
    public static void init(JFrame jFrame,int width,int height) {
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭方式
        jFrame.setSize(width, height);//窗口大小
        jFrame.setVisible(true);//可见
    }

    public static void main(String[] args) {
        init(new TestThread(), 500, 200);
    }

}

效果如下:

 

posted @ 2017-10-26 16:09  听见温暖www  阅读(1528)  评论(0编辑  收藏  举报