JAVA中實現多執行緒的常用方式
阿新 • • 發佈:2021-01-30
JAVA中實現多執行緒的常用方式
JAVA實現多執行緒的三種方式:
- 繼承Thread類並且重寫run方法
- 實現Runnable介面,並且實現介面中的run方法,使用Thread類的有參構造將實現類作為引數傳入
- 實現Callable介面並且實現介面中的call方法
1.繼承Thread類並且重寫run方法
public class TestMyThread extends Thread{
public static void main(String[] args) {
Thread myThread = new TestMyThread ();
myThread.setName("分支執行緒");
myThread.start();
System.out.println(Thread.currentThread().getName()+"執行緒");
}
//重寫Thread類中的run方法
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
執行結果:
2.實現Runnable介面,並且實現介面中的run方法
public class TestMyRunnable implements Runnable{
public static void main(String[] args) {
TestMyRunnable myRunnable = new TestMyRunnable();
Thread thread = new Thread(myRunnable);
thread.setName("分支執行緒");
thread.start();
System.out.println(Thread. currentThread().getName()+"執行緒");
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
執行結果:
3.實現Callable介面並且實現介面中的call方法
Callable是jdk8的新特性 介面中的call方法可以丟擲異常
而Runnable中的run方法不行並且call有返回值而run方法沒有
但是這種方式效率比較低
public class TestMyCallable implements Callable<String> {
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestMyCallable myCallable = new TestMyCallable();
FutureTask<String> futureTask = new FutureTask<>(myCallable);
Thread thread = new Thread(futureTask);
thread.setName("分支執行緒");
thread.start();
for (int i = 0; i <1000 ; i++) {
System.out.println(Thread.currentThread().getName()+"------->"+i);
}
//get方法會導致主執行緒阻塞 在沒拿到分支執行緒執行結果之前一直等待
//get方法必須等待分支執行緒執行完之後才能拿到執行結果並且返回
System.out.println(futureTask.get());
System.out.println(Thread.currentThread().getName()+"執行緒");
}
@Override
public String call() throws Exception {
for (int i = 0; i <1000 ; i++) {
System.out.println(Thread.currentThread().getName()+"----->"+i);
}
return Thread.currentThread().getName();
}
}
執行結果: