更新時(shí)間:2020-09-15 16:06:21 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1703次
Java多線程的實(shí)現(xiàn)的四種方法,你都知道嗎
1.繼承Thread類,重寫run方法(其實(shí)Thread類本身也實(shí)現(xiàn)了Runnable接口)
2.實(shí)現(xiàn)Runnable接口,重寫run方法
3.實(shí)現(xiàn)Callable接口,重寫call方法(有返回值)
4.使用線程池(有返回值)
1.繼承Thread類,重寫run方法
每次創(chuàng)建一個(gè)新的線程,都要新建一個(gè)Thread子類的對(duì)象
啟動(dòng)線程,new Thread子類().start()
創(chuàng)建線程實(shí)際調(diào)用的是父類Thread空參的構(gòu)造器
public class MyThread {
public static void main(String ards[]){
for(int i=0;i<10;i++){
new ExtendsThread().start();
}
System.out.println(Thread.currentThread().getName());
}
}
class ExtendsThread extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}2.實(shí)現(xiàn)Runnable接口,重寫run方法
不論創(chuàng)建多少個(gè)線程,只需要?jiǎng)?chuàng)建一個(gè)Runnable接口實(shí)現(xiàn)類的對(duì)象
啟動(dòng)線程,new Thread(Runnable接口實(shí)現(xiàn)類的對(duì)象).start()
創(chuàng)建線程調(diào)用的是Thread類Runable類型參數(shù)的構(gòu)造器
public class MyThread {
public static void main(String ards[]){
Runnable implRunnable = new ImplRunnable();
for(int i=0;i<10;i++){
new Thread(implRunnable).start();
}
System.out.println(Thread.currentThread().getName());
}
}
class ImplRunnable implements Runnable{
private volatile int i = 0;
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"--"+ i++);
}
}3.實(shí)現(xiàn)Callable接口,重寫call方法(有返回值)
自定義類實(shí)現(xiàn)Callable接口時(shí),必須指定泛型,該泛型即返回值的類型
每次創(chuàng)建一個(gè)新的線程,都要?jiǎng)?chuàng)建一個(gè)新的Callable接口的實(shí)現(xiàn)類、
如何啟動(dòng)線程?
(1)創(chuàng)建一個(gè)Callable接口的實(shí)現(xiàn)類的對(duì)象
(2)創(chuàng)建一個(gè)FutureTask對(duì)象,傳入Callable類型的參數(shù)
public FutureTask(Callable<V>callable){……}
(3)調(diào)用Thread類重載的參數(shù)為Runnable的構(gòu)造器創(chuàng)建Thread對(duì)象
將FutureTask作為參數(shù)傳遞
public class FutureTask<V>implements RunnableFuture<V>
public interface RunnableFuture<V>extends Runnable,Future<V>
如何獲取返回值?
調(diào)用FutureTask類的get()方法
public class MyThread {
public static void main(String ards[]) throws InterruptedException, ExecutionException{
for(int i=0;i<10;i++){
Callable<Integer> implCallable = new ImplCallable();
FutureTask<Integer> futureTask = new FutureTask<Integer>(implCallable);
new Thread(futureTask).start();
System.out.println(Thread.currentThread().getName()+"----"+futureTask.get());
}
System.out.println(Thread.currentThread().getName());
}
}
class ImplCallable implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int result = 0;
for(int i=0;i<10;i++){
result += i;
}
System.out.println(Thread.currentThread().getName());
return result;
}
}4.線程池
Executors類
/**
*
* 線程池
* 跟數(shù)據(jù)庫連接池類似
* 避免了線程的創(chuàng)建和銷毀造成的額外開銷
*
* java.util.concurrent
*
* Executor 負(fù)責(zé)現(xiàn)成的使用和調(diào)度的根接口
* |--ExecutorService 線程池的主要接口
* |--ThreadPoolExecutor 線程池的實(shí)現(xiàn)類
* |--ScheduledExecutorService 接口,負(fù)責(zé)線程的調(diào)度
* |--ScheduledThreadPoolExecutor (extends ThreadPoolExecutor implements ScheduledExecutorService)
*
*
* Executors工具類
* 提供了創(chuàng)建線程池的方法
*
*/
public class ThreadPool {
public static void main(String[] args){
//使用Executors工具類中的方法創(chuàng)建線程池
ExecutorService pool = Executors.newFixedThreadPool(5);
ThreadPoolDemo demo = new ThreadPoolDemo();
//為線程池中的線程分配任務(wù),使用submit方法,傳入的參數(shù)可以是Runnable的實(shí)現(xiàn)類,也可以是Callable的實(shí)現(xiàn)類
for(int i=1;i<=5;i++){
pool.submit(demo);
}
//關(guān)閉線程池
//shutdown : 以一種平和的方式關(guān)閉線程池,在關(guān)閉線程池之前,會(huì)等待線程池中的所有的任務(wù)都結(jié)束,不在接受新任務(wù)
//shutdownNow : 立即關(guān)閉線程池
pool.shutdown();
}
}
class ThreadPoolDemo implements Runnable{
/**多線程的共享數(shù)據(jù)*/
private int i = 0;
@Override
public void run() {
while(i<=50){
System.out.println(Thread.currentThread().getName()+"---"+ i++);
}
}
}public class ThreadPool2 {
public static void main(String args[]){
ExecutorService executorService = Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
Future<Integer> future = executorService.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int result = 0;
for(int i=0;i<=10;i++){
result += i;
}
return result;
}
});
try {
System.out.println(Thread.currentThread().getName()+"--"+future.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executorService.shutdown();
}
}Java多線程視頻教程:http://www.soulsinkind.com/javavideo/188.html
以上就是對(duì)“Java多線程的實(shí)現(xiàn)的四種方法,你都知道嗎”的介紹,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)