啟動線程方式一: 線程可以驅(qū)動任務(wù),因此需要一種描述任務(wù)的方式,可以由Runnable接口來提供,要想定義任務(wù),只需要實現(xiàn)Runnable接口并編寫run()方法,使得該任務(wù)執(zhí)行你的命令.
private static class LiftOff implements Runnable{
private int count = 10000;
@Override
public void run() {
while(count-- > 0){
System.out.println("count :"+count);
Thread.yield();
}
public static void main(String[] args) {
LiftOff liftOff = new LiftOff();
liftOff.run();
}
啟動線程方式二: 將Runnable對象轉(zhuǎn)變?yōu)楣ぷ魅蝿?wù)的傳統(tǒng)方式是把它提交給一個Thread構(gòu)造器,Thread構(gòu)造器只需要一個Runnable對象,然后調(diào)用start方法就可以啟動
Thread t = new Thread(new LiftOff());
t.start();
啟動線程方式三:使用Executor,創(chuàng)建線程池對象, 即ExecutorService 對象茴厉,然后調(diào)用exec()方法,
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
詳細介紹第三種方式凯肋,Executor的三個方法:
1门烂,newFixedThreadPool
2宙枷,newSingleThreadExecutor
3钙畔,newCachedThreadPool
如果向SingleThreadExecutor提交了多個任務(wù)甚疟,那么這些任務(wù)將排隊仗岖,每個任務(wù)都會在下一個任務(wù)開始之前運行結(jié)束逃延,所有的任務(wù)將使用相同的線程,下面的實例中轧拄,SingleThreadExecutor會序列化所有提交給它的任務(wù)揽祥,并會維護它自己的任務(wù)隊列。
ExecutorService exec = Executors.newSingleThreadExecutor();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
另外應(yīng)用場景:假設(shè)你有大量的線程檩电,那他們運行的任務(wù)將使用文件系統(tǒng)拄丰,你可以用SingleThreadExecutor來運行這些線程,以確保任意時刻在任務(wù)線程中都只有唯一的任務(wù)在運行俐末,在這種方式中料按,你不需要在共享資源上處理同步,同時不會過度使用文件系統(tǒng)卓箫,有時更好的解決方案是在資源上同步载矿,但是SingleThreadExecutor可以讓你省去只是為了維持某些原型而進行的各種協(xié)調(diào)努力。