Runnable使用
class LiftOff implements Runnable {
protected int countDown = 10;//default
private static int taskCount = 0;
private final int id = taskCount++;
public LiftOff() {
}
public LiftOff(int countDown) {
this.countDown = countDown;
}
public String status() {
return "#" + id + "(" + (countDown == 0 ? "LiftOff!" : countDown) + ")、";
}
public void run() {
while (countDown-- > 0) {
System.out.print(status());
Thread.yield();//告诉cpu可以让其他线程运行了
}
}
}
class ThreadTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(new LiftOff(5)).start();
}
System.out.println("main is ready");
}
}
结果每次是不一样的:
#1(4)、#0(4)、#2(4)、#0(3)、#2(3)、#1(3)、
#2(2)、#2(1)、#2(LiftOff!)、#0(2)、
#3(4)、#0(1)、#1(2)、#0(LiftOff!)、#3(3)、#1(1)
、#3(2)、#1(LiftOff!)、#3(1)、#3(LiftOff!)、main is ready
#4(4)、#4(3)、#4(2)、#4(1)、#4(LiftOff!)
or
#0(4)、#2(4)、main is ready
#1(4)、#0(3)、#1(3)、#3(4)、#0(2)、#2(3)、#4(4)、#2(2)、#0(1)、#1(2)、
#0(LiftOff!)、#3(3)、#2(1)、#2(LiftOff!)、#4(3)、#4(2)
、#3(2)、#1(1)、#3(1)、#4(1)、#1(LiftOff!)、#3(LiftOff!)、#4(LiftOff!)
使用Executor
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class ThreadTest {
public static void main(String[] args) {
System.out.println("main is ready");
ExecutorService eService = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
eService.execute(new LiftOff(5));
}
eService.shutdown();//防止新任务被提交给此Executor
}
}
也可以固定线程池:
ExecutorService eService = Executors.newFixedThreadPool(5);
单一线程池,相当于顺序执行:
ExecutorService eService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 5; i++) {
eService.execute(new LiftOff(5));
}
结果:
main is ready
#0(4)、#0(3)、#0(2)、#0(1)、#0(LiftOff!)、
#1(4)、#1(3)、#1(2)、#1(1)、#1(LiftOff!)、
#2(4)、#2(3)、#2(2)、#2(1)、#2(LiftOff!)
、#3(4)、#3(3)、#3(2)、#3(1)、#3(LiftOff!)、
#4(4)、#4(3)、#4(2)、#4(1)、#4(LiftOff!)