多線(xiàn)程Thread,Runnable,Callable實(shí)現(xiàn)方式
一、創(chuàng)建線(xiàn)程的常用三種方式
1、繼承Thread類(lèi)
創(chuàng)建MyThread 類(lèi)并繼承Thread
package com.zrrd.XianCheng;
/**
*繼承Thread類(lèi),達(dá)到線(xiàn)程的能力
*/
public class MyThread extends Thread{
private String name;
public MyThread(String name){
this.name=name;
}
@Override
public void run() {
for(int i=0;i<=100;i++){
System.out.println(name+"下載了"+i+"%");
}
}
}
創(chuàng)建測(cè)試類(lèi)ThreadText 啟動(dòng)線(xiàn)程,執(zhí)行代碼塊
package com.zrrd.XianCheng;
/**
* 測(cè)試線(xiàn)程代碼
*/
public class ThreadText {
public static void main(String[] args) {
//創(chuàng)建一個(gè)線(xiàn)程對(duì)象
MyThread my=new MyThread( "A線(xiàn)程");
//啟動(dòng)線(xiàn)程start()
my.start();
//創(chuàng)建第二個(gè)線(xiàn)程對(duì)象
MyThread my1=new MyThread("B線(xiàn)程");
//啟動(dòng)線(xiàn)程start()
my1.start();
}
}
執(zhí)行結(jié)果圖片,截取部分結(jié)果集


2、實(shí)現(xiàn)Runnable接口(重點(diǎn))
以多個(gè)線(xiàn)程并發(fā),解決方法為例
**創(chuàng)建BingFa 類(lèi)并實(shí)現(xiàn)Runnable **
package com.zrrd.XianCheng;
/**
* 多個(gè)線(xiàn)程并發(fā),解決方法
*/
public class BingFa implements Runnable {
int piaoshu=50;
Object obj=new Object();
@Override
public void run() {
/* 同步代碼塊用synchronized修飾*/
while (true){
synchronized (obj){//發(fā)生阻塞事件
if(piaoshu>0){
System.out.println(Thread.currentThread().getName()+"剩余"+(piaoshu--)+"張");
}else{
break;
}
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"結(jié)束售票");
}
}
創(chuàng)建測(cè)試類(lèi)BingFaText啟動(dòng)線(xiàn)程,執(zhí)行代碼塊
package com.zrrd.XianCheng;
import java.lang.Thread;
public class BingFaText {
public static void main(String[] args) {
BingFa bf=new BingFa();
Thread th1=new Thread(bf,"售票窗口1");
Thread th2=new Thread(bf,"售票窗口2");
Thread th3=new Thread(bf,"售票窗口3");
Thread th4=new Thread(bf,"售票窗口4");
th1.start();
th2.start();
th3.start();
th4.start();
}
}
執(zhí)行結(jié)果圖片,截取部分結(jié)果集


3、 實(shí)現(xiàn)Callable接口(JDK1.5版本之后引入的)
創(chuàng)建MyCallable類(lèi)并實(shí)現(xiàn)Callable<T>
package com.zrrd.XianCheng;
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String> {//多線(xiàn)程主體類(lèi)
private int ticket=5; //線(xiàn)程共享資源
@Override
public String call() throws Exception {
for (int i=0;i<100;i++){
if(this.ticket>0){
System.out.println("賣(mài)票,ticket="+this.ticket--);
}
}
return "票已賣(mài)光!"; //返回結(jié)果
}
}
創(chuàng)建測(cè)試類(lèi)MyCallableDemo啟動(dòng)線(xiàn)程,執(zhí)行代碼塊
package com.zrrd.XianCheng;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class MyCallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyCallable callable1 = new MyCallable();//創(chuàng)建多線(xiàn)程實(shí)例1
MyCallable callable2 = new MyCallable();//創(chuàng)建多線(xiàn)程實(shí)例2
FutureTask task1 = new FutureTask<String>(callable1);
FutureTask task2 = new FutureTask<String>(callable2);
//FutureTask 是Runnable接口的子類(lèi),所以可以使用Thread類(lèi)的構(gòu)造方法來(lái)接收task對(duì)象
new Thread(task1).start();
new Thread(task2).start();
System.out.println("A______"+task1.get());
System.out.println("B______"+task2.get());
}
}
執(zhí)行結(jié)果圖片

總結(jié)
以上就是實(shí)現(xiàn)多線(xiàn)程的方式,在實(shí)際開(kāi)發(fā)項(xiàng)目中不建議使用第一種繼承Thread方式實(shí)現(xiàn)線(xiàn)程,這樣對(duì)代碼的侵入性太高,而且類(lèi)與類(lèi)之間單繼承,達(dá)不到代碼重用規(guī)則,建議使用第二種、或第三種。
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行指定方法的幾種實(shí)現(xiàn)方式
在Spring Boot應(yīng)用程序中,要實(shí)現(xiàn)在應(yīng)用啟動(dòng)時(shí)自動(dòng)執(zhí)行某些代碼,本文主要介紹了SpringBoot啟動(dòng)時(shí)自動(dòng)執(zhí)行指定方法的幾種方式,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-03-03
Java 替換字符串右側(cè)出現(xiàn)的第一個(gè)子串方式
這篇文章主要介紹了Java 替換字符串右側(cè)出現(xiàn)的第一個(gè)子串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
基于Java回顧之網(wǎng)絡(luò)通信的應(yīng)用分析
在這篇文章里,我們主要討論如何使用Java實(shí)現(xiàn)網(wǎng)絡(luò)通信,包括TCP通信、UDP通信、多播以及NIO2013-05-05
java字符串遍歷以及統(tǒng)計(jì)字符串中各類(lèi)字符
這篇文章主要為大家詳細(xì)介紹了java字符串遍歷以及字符串中各類(lèi)字符統(tǒng)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
springboot 如何配置多個(gè)jndi數(shù)據(jù)源
這篇文章主要介紹了springboot 如何配置多個(gè)jndi數(shù)據(jù)源的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java中的instanceof關(guān)鍵字在Android中的用法實(shí)例詳解
instanceof是Java的一個(gè)二元操作符,和==,>,<是同一類(lèi)東西。接下來(lái)通過(guò)本文給大家介紹Java中的instanceof關(guān)鍵字在Android中的用法,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-07-07
spring4新特性之web開(kāi)發(fā)增強(qiáng)
這篇文章主要介紹了spring4新特性之web開(kāi)發(fā)增強(qiáng)的相關(guān)資料,需要的朋友可以參考下2017-09-09
SpringMVC攔截器和異常處理器使用示例超詳細(xì)講解
攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行。本文將詳細(xì)講講SpringMVC中攔截器參數(shù)及攔截器鏈配置,感興趣的可以嘗試一下2022-09-09

