Java线程如何按照你想要的顺序执行

有四个线程ABCD,我需要他们按照abcd的顺序依次打印5次,即ABCDABCDABCDABCDABCD。如何实现呢?
首先你需要了解如何控制线程执行顺序。那就需要知道唤醒以及等待的顺序,所以每个进程需要添加2个琐,一个对象琐prev,也就是前一个程序执行的琐,一个是本身的琐self琐。一个程序想要执行,必须是前一个对象琐释放(程序中用的是wait),自身的self琐被唤醒。
比如A如果想要执行。就必须是D的对象琐被释放,A的自身琐被唤醒。`
简单介绍一下sleep方法以及Wait方法
*Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等*

Sleep方法睡眠时:依然占有琐。其他线程无法访问这个对象,等等sleep时间结束后,改线程可能现在并不会被立即执行(会执行,排队等待执行),可能其他线程正在运行。
Wait方法睡眠时:释放对象琐,其他线程可以访问这个对象。(wiat()必须放在synchronized 中,否则会扔出”java.lang.IllegalMonitorStateException“异常。)wait方法使用notify方法或指定睡眠时间来唤醒

public class MyThreadTest implements Runnable {     
    private String name;
    private Object prev;
    private Object self;
    private MyThreadTest(String name, Object prev, Object self) {
        this.name = name;
        this.prev = prev;
        this.self = self;
    }
    public void run(){
            int count=5;
            while(count>0){
                synchronized (prev) {
                    synchronized (self) {
                        System.out.println(name);
                        count--;
                        self.notify();
                    }
                    try {
                        prev.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }
    }
    public static void main(String[] args) throws Exception{
        Object a = new Object();
        Object b = new Object();
        Object c = new Object();
        Object d = new Object();
        MyThreadTest th1 =new MyThreadTest("A", d, a);
        MyThreadTest th2 =new MyThreadTest("B", a, b);
        MyThreadTest th3 =new MyThreadTest("C", b, c);
        MyThreadTest th4 =new MyThreadTest("D", c, d);

        new Thread(th1).start();
        Thread.sleep(1);//必须要加确保程序按照顺序执行 
        new Thread(th2).start();
        Thread.sleep(1); //必须要加确保程序按照顺序执行
        new Thread(th3).start();
        Thread.sleep(1); //必须要加确保程序按照顺序执行
        new Thread(th4).start();
        Thread.sleep(1); //必须要加确保程序按照顺序执行

    }

}    `

线程类的常用方法:

   sleep(): 线程睡眠单位好眠。
   isAlive(): 判断线程是否存活。
   join(): 等待线程终止。
  activeCount(): 程序中活跃的线程数。
enumerate(): 枚举程序中的线程。
currentThread(): 得到当前线程。
  isDaemon(): 判断一个线程是否为守护线程。
  setDaemon(): 设置一个线程为守护线程。
  setName(): 为线程设置一个名称。
  wait(): 强迫一个线程等待。
  notify(): 通知一个线程继续运行。
  setPriority(): 设置一个线程的优先级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值