2020-06-16Java入門(mén)(二十)多線(xiàn)程 線(xiàn)程同步機(jī)制 線(xiàn)程的狀態(tài) 線(xiàn)程池

佳哥?文濤???

單線(xiàn)程

/**

* 并行:兩個(gè)或多個(gè)事件在 同一時(shí)間發(fā)成 同時(shí)發(fā)生 兩個(gè)CPU 執(zhí)行兩個(gè)任務(wù)

* 并發(fā):兩個(gè)或多個(gè)事件 在同一時(shí)間段執(zhí)行 一個(gè)cpu交替執(zhí)行

*

* 內(nèi)存 所有的應(yīng)用程序都會(huì)到內(nèi)存中

* 線(xiàn)程 一個(gè)進(jìn)程包含多個(gè)線(xiàn)程 列如:電腦管家里面的功能就是加速 清理 病毒查殺

* (cpu中央處理器 對(duì)數(shù)據(jù)進(jìn)行計(jì)算 amd inter) 線(xiàn)程是進(jìn)程中的一個(gè)執(zhí)行單元

* 進(jìn)程 進(jìn)入大內(nèi)存中的程序就是進(jìn)程 idea 微信

*

* java 搶占式調(diào)度 高度切換 誰(shuí)的優(yōu)先級(jí)高 誰(shuí)先執(zhí)行

* 主線(xiàn)程 執(zhí)行主方法的線(xiàn)程

*/

public class Demo {

//主線(xiàn)程 程序從main方法先執(zhí)行

? ? public static void main(String[] args) {//Jvm執(zhí)行main方法進(jìn)入棧內(nèi)存 main方法通向cpu的路徑

? ? ? ? Person person =new Person("周一");

person.run();//單線(xiàn)程的異常

? ? ? ? Person person1 =new Person("周二");

person1.run();

}

}

多線(xiàn)程

多線(xiàn)程直接互不影響

獲取線(xiàn)程名稱(chēng)System.out.println(Demo.currentThread().getName());? ? 線(xiàn)程名稱(chēng)setName();==new MyThread(“線(xiàn)程名稱(chēng)").start? ? ? ?

thread?常用方法sleep當(dāng)前毫秒值內(nèi)睡眠

實(shí)現(xiàn)接口方式創(chuàng)建多線(xiàn)程

public class Test {

public static void main(String[] args) {

/*

Runnable runnable = new Runnable();

Thread thread = new Thread(runnable);

thread.start();

for (int i = 0; i <20 ; i++) {

System.out.println(Thread.currentThread().getName()+"-->"+i);

}*/

? ? ? ? //匿名內(nèi)部類(lèi) 多線(xiàn)程? 父類(lèi)是Thread 調(diào)用run

/*new Thread(){

@Override

public void run() {

for (int i = 0; i < 10; i++) {

System.out.println(Thread.currentThread().getName() +"-->"+i);

}

}

}.start();*/

? ? ? ? //匿名內(nèi)部類(lèi)實(shí)現(xiàn)接口的方式

? ? ? ? java.lang.Runnable runnable =new java.lang.Runnable() {

@Override

? ? ? ? ? ? public void run() {

for (int i =0; i <10 ; i++) {

System.out.println(Thread.currentThread().getName()+"-->"+i);

}

}

};

new Thread(runnable).start();

}

}


線(xiàn)程安全問(wèn)題? 電影售票的問(wèn)題(共享數(shù)據(jù)會(huì)產(chǎn)生安全問(wèn)題?按個(gè)窗口同時(shí)賣(mài)一些票) 多線(xiàn)程處理?三種方式處理現(xiàn)成安全的問(wèn)題

public class Synchronuzedimplements java.lang.Runnable {

private int ticket=50;

// 使用鎖 防止線(xiàn)程安全 創(chuàng)建鎖對(duì)象lock unlock

? ? Lockl=new ReentrantLock();

@Override

? ? public void run() {

while (true){

pickTicket();

}

}

//使用同步方法

? ? //還有靜態(tài)的同步方法 直接在synchronized前面加Static

/* public synchronized void pickTicket(){

l.lock();

if (ticket>0){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

? ? ? ? ? ? System.out.println(Thread.currentThread().getName()+"售票"+ticket);

ticket--;

}

? ? ? ? //釋放鎖 所可以放在finally里面l.unlock();

}*/

? //unlock 放在finally里面

? public synchronized void pickTicket(){

l.lock();

if (ticket>0){

try {

Thread.sleep(10);

System.out.println(Thread.currentThread().getName()+"售票"+ticket);

ticket--;

}catch (InterruptedException e) {

e.printStackTrace();

}finally {

//釋放鎖 所可以放在finally里面

? ? ? ? ? ? ? ? l.unlock();//正常的三個(gè)線(xiàn)程同時(shí)搶占cPU

? ? ? ? ? ? }

}

}

}

main??public class SynchronuzedMain {

public static void main(String[] args) {

Synchronuzed synchronuzed =new Synchronuzed();

Thread thread1 =new Thread(synchronuzed);

Thread thread2 =new Thread(synchronuzed);

Thread thread3 =new Thread(synchronuzed);

thread1.start();

thread2.start();

thread3.start();//(同步方法時(shí))只可以一個(gè)線(xiàn)程執(zhí)行

? ? }

}



線(xiàn)程的狀態(tài)?阻塞狀態(tài)()(?主動(dòng)放棄cpu休眠狀態(tài)?無(wú)線(xiàn)等待狀態(tài)? )新建?運(yùn)行? 死亡

TimeWating?計(jì)時(shí)等待? ? notity?如果有多個(gè)線(xiàn)程等待?隨機(jī)喚醒一個(gè)線(xiàn)程

notityAll喚醒所有等待的線(xiàn)程

/**

* 等待喚醒案例

* 消費(fèi)者 需要什么樣的包子 要告訴生產(chǎn)者 生產(chǎn)者做 所以消費(fèi)者需要等待wating5秒中(sleep(5000))

* 生產(chǎn)者 做包子 做完包子要喚醒notity消費(fèi)者 告訴他可以吃包子了

*

* 通用包子 作為類(lèi)Baozi

* 我們需要用到同步代碼 保證和等待喚醒的是一個(gè)線(xiàn)程 同步技術(shù)

*

* */

public class Wating {

public static void main(String[] args) {

//創(chuàng)建鎖對(duì)象 保證唯一

? ? ? ? Object object =new Object();

//創(chuàng)建一個(gè)消費(fèi)者

? ? ? ? new Thread(){

@Override

? ? ? ? ? ? public void run() {

//消費(fèi)者告訴生產(chǎn)者 要什么樣的包子

? ? ? ? ? ? ? // Baozi baozi = new Baozi("紫色","剝皮");

? ? ? ? ? ? ? ? //一直等著買(mǎi)包子

? ? ? ? ? ? ? ? while (true){

synchronized (object){

System.out.println("告知生產(chǎn)者要的包子種類(lèi) 數(shù)量");

//開(kāi)始等待包子做好

? ? ? ? ? ? ? ? ? ? ? ? try {

object.wait();

}catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("喚醒之后 可以吃包子了");

}

}

}

}.start();

//匿名對(duì)象 線(xiàn)程 創(chuàng)建一個(gè)生產(chǎn)者

? ? ? ? new Thread(){

@Override

? ? ? ? ? ? public void run() {

while (true){

try {

Thread.sleep(5000);

}catch (InterruptedException e) {

e.printStackTrace();

}

//同步技術(shù)

? ? ? ? ? ? ? ? ? ? synchronized (object){

System.out.println("用了5秒做完了包子 告訴消費(fèi)者可以吃包子了");

//喚醒他

? ? ? ? ? ? ? ? ? ? ? ? object.notify();

}

}

//生產(chǎn)者 花了5秒做包子

? ? ? ? ? ? }

}.start();

}

}


等待與喚醒機(jī)制?線(xiàn)程間的通信? (生產(chǎn)包子?吃包子)多個(gè)線(xiàn)程之間的協(xié)作機(jī)制 有效的利用資源 (生產(chǎn)一個(gè)包子?吃一個(gè)包子)


線(xiàn)程池?頻繁的創(chuàng)建線(xiàn)程降低效率?可以用線(xiàn)程池來(lái)達(dá)到效果

線(xiàn)程池?的底層原理?一個(gè)容器-> 集合?hashMap?Arraylist hashset LinkedList(常用)-->? ? 容器有很多線(xiàn)程?

程序第一次啟動(dòng)?創(chuàng)建多個(gè)線(xiàn)程保存到一個(gè)集合中? 使用線(xiàn)程時(shí)? 從集合中取出來(lái)?remove方法?返回的是被移除的元素?線(xiàn)程只能被一個(gè)任務(wù)使用? ?

removeFirst移除第一個(gè)線(xiàn)程?使用完畢?需要把線(xiàn)程歸還給線(xiàn)程池?list.add添加?隊(duì)列的思想?線(xiàn)程排隊(duì)

java5?線(xiàn)程池?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容