您的位置:首页 > 编程语言 > Java开发

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

2016-12-28 15:21 459 查看
有四个线程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(): 设置一个线程的优先级。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息