在我們?nèi)粘i_發(fā)中,經(jīng)常會碰到以下幾種情況
1.大數(shù)據(jù)量的處理 如 數(shù)據(jù)同步,數(shù)據(jù)簡單處理,數(shù)據(jù)的檢驗等
2.某段代碼的速度慢
針對不同的情況,我們可以采取多線程的方式進行優(yōu)化,先簡單地看3種多線程的實現(xiàn)方式
1.繼承Thread實現(xiàn)多線程
1.重寫Thread的run方法
package com.wwj.test.thread;
public class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
2.通過start方法調(diào)用
package com.wwj.test.thread;
public class Main {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
2.實現(xiàn)Runable接口實現(xiàn)多線程
1.實現(xiàn)Runable的run方法
package com.wwj.test.thread;
public class MyRunable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
2.通過Thread.start方法啟動多線程 或者 直接是用lambda表達式
package com.wwj.test.thread;
public class Main {
public static void main(String[] args) {
// MyThread myThread = new MyThread();
// myThread.start();
// Thread myThread = new Thread(new MyRunable());
// myThread.start();
new Thread(() ->{
System.out.println(Thread.currentThread().getName());
}).start();
}
}
3.實現(xiàn)Callable接口實現(xiàn)多線程
通過以上2種方法都可以實現(xiàn)多線程的應(yīng)用,但是都不能直接在主線程中獲取到其它線程的返回結(jié)果,因此,在一些特定的情況下我們可以采用異步編程的方式實現(xiàn)多線程
1.實現(xiàn)Callable接口
package com.wwj.test.thread;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName());
return 0;
}
}
2.用過Thread.start啟動多線程,并拿到返回結(jié)果
package com.wwj.test.thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Main {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// MyThread myThread = new MyThread();
// myThread.start();
// Thread myThread = new Thread(new MyRunable());
// myThread.start();
// new Thread(() ->{
// System.out.println(Thread.currentThread().getName());
// }).start();
//創(chuàng)建MyCallable對象
MyCallable myCallable = new MyCallable();
//開始線程
FutureTask<Integer> integerFutureTask = new FutureTask<>(myCallable);
new Thread(integerFutureTask).start();
int a = integerFutureTask.get();
System.out.println(a);
}
}