啟動(dòng)線程方式一: 線程可以驅(qū)動(dòng)任務(wù),因此需要一種描述任務(wù)的方式,可以由Runnable接口來(lái)提供,要想定義任務(wù),只需要實(shí)現(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();
}
啟動(dòng)線程方式二: 將Runnable對(duì)象轉(zhuǎn)變?yōu)楣ぷ魅蝿?wù)的傳統(tǒng)方式是把它提交給一個(gè)Thread構(gòu)造器,Thread構(gòu)造器只需要一個(gè)Runnable對(duì)象,然后調(diào)用start方法就可以啟動(dòng)
Thread t = new Thread(new LiftOff());
t.start();
啟動(dòng)線程方式三:使用Executor,創(chuàng)建線程池對(duì)象, 即ExecutorService 對(duì)象,然后調(diào)用exec()方法,
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
詳細(xì)介紹第三種方式,Executor的三個(gè)方法:
1,newFixedThreadPool
2,newSingleThreadExecutor
3,newCachedThreadPool
如果向SingleThreadExecutor提交了多個(gè)任務(wù),那么這些任務(wù)將排隊(duì),每個(gè)任務(wù)都會(huì)在下一個(gè)任務(wù)開始之前運(yùn)行結(jié)束,所有的任務(wù)將使用相同的線程,下面的實(shí)例中,SingleThreadExecutor會(huì)序列化所有提交給它的任務(wù),并會(huì)維護(hù)它自己的任務(wù)隊(duì)列。
ExecutorService exec = Executors.newSingleThreadExecutor();
for(int i = 0; i < 5; i++)
exec.execute(new LiftOff());
exec.shutdown();
另外應(yīng)用場(chǎng)景:假設(shè)你有大量的線程,那他們運(yùn)行的任務(wù)將使用文件系統(tǒng),你可以用SingleThreadExecutor來(lái)運(yùn)行這些線程,以確保任意時(shí)刻在任務(wù)線程中都只有唯一的任務(wù)在運(yùn)行,在這種方式中,你不需要在共享資源上處理同步,同時(shí)不會(huì)過(guò)度使用文件系統(tǒng),有時(shí)更好的解決方案是在資源上同步,但是SingleThreadExecutor可以讓你省去只是為了維持某些原型而進(jìn)行的各種協(xié)調(diào)努力。