您好,登錄后才能下訂單哦!
Java多線程的在開發(fā)中用到的很多,簡單總結(jié)一下幾種寫法,分別是繼承Thread方法,實現(xiàn)Runnable接口,實現(xiàn)Callable接口;
1.繼承Thread方法
class TestThread extends Thread{
String name;
public TestThread(String name){
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 6; i++) {
System.out.println(this.name+":"+i);
}
}
}
main方法調(diào)用:
Thread啟動有兩個方法,一個是start()方法,一個是run()方法,但是直接調(diào)用run方法時線程不會交替運行,而是順序執(zhí)行,只有用start方法時才會交替執(zhí)行
TestThread tt1 = new TestThread("A");
TestThread tt2 = new TestThread("B");
tt1.start();
tt2.start();
運行結(jié)果:
2.實現(xiàn)Runnable接口,有多種寫法
2.1外部類
class TestRunnable implements Runnable{
String name;
public TestRunnable(String name){
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 6; i++) {
System.out.println(this.name+":"+i);
}
}
}
調(diào)用:
TestRunnable tr1 = new TestRunnable("C");
TestRunnable tr2 = new TestRunnable("D");
new Thread(tr1).start();
new Thread(tr2).start();
2.2匿名內(nèi)部類方式
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}).start();
2.3 Lamda表達式,jdk1.8,只要是函數(shù)式接口,都可以使用Lamda表達式或者方法引用
new Thread(()->{
for (int i = 0; i < 6; i++) {
System.out.println(i);
}
}).start();
2.4ExecutorService創(chuàng)建線程池的方式
class TestExecutorService implements Runnable{
String name;
public TestExecutorService(String name){
this.name=name;
}
@Override
public void run() {
for (int i = 0; i < 6; i++) {
System.out.println(this.name+":"+i);
}
}
}
調(diào)用:可以創(chuàng)建固定個數(shù)的線程池
ExecutorService pool = Executors.newFixedThreadPool(2);
TestExecutorService tes1 = new TestExecutorService("E");
TestExecutorService tes2 = new TestExecutorService("F");
pool.execute(tes1);
pool.execute(tes2);
pool.shutdown();
運行結(jié)果跟2.1差不多
3.實現(xiàn)Callable接口,可以返回結(jié)果
//Callable<V>提供返回數(shù)據(jù),根據(jù)需要返回不同類型
class TestCallable implements Callable<String>{
private int ticket = 5;
@Override
public String call() throws Exception {
for (int i = 0; i < 5; i++) {
if(this.ticket>0)
System.out.println("買票,ticket="+this.ticket--);
}
return "票賣完了";
}
}
調(diào)用:
Callable<String> tc = new TestCallable();
FutureTask<String> task = new FutureTask<String>(tc);
new Thread(task).start();
try {
System.out.println(task.get());//獲取返回值
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
運行結(jié)果:
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。