日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java thread_Java(多线程Thread)

發(fā)布時間:2023/12/15 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java thread_Java(多线程Thread) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

畢設遇到些問題,猜想可能與多線程有關聯(lián),所以花了幾天時間學習了多線程,在此小結一番

1.進程與多進程

一個進程對應一個應用程序。在java的開發(fā)環(huán)境下啟動JVM,就表示啟動了一個進程。在同一個操作系統(tǒng)中,可以啟動多個進程

對于單核計算機來講,在同一個時間點上運行了游戲進程和音樂進程,但實際二者并不是同時運行

而計算機的CPU在某個時間點上只能做一件事,所以計算機在 游戲進程 和 音樂進程 之間頻繁的切換執(zhí)行,由于切換速度極高,所以人類感覺兩者在同時進行

多進程的作用不是提高執(zhí)行速度,而是提高CPU的使用率

進程和進程之間的內存是獨立的

2.線程與多線程

線程是一個進程中的執(zhí)行場景。一個進程可以啟動多個線程

多線程作用不是為了提高執(zhí)行速度,而是提高應用程序的使用率

線程和線程共享“堆內存和方法區(qū)內存”,棧內存是獨立的,一個線程一個棧

由于多線程在來回切換,所以給現(xiàn)實世界中的人類一種錯覺:感覺多個線程在同時并發(fā)執(zhí)行。

3.關于Java程序的運行原理

java命令會啟動JVM,等于啟動了一個應用程序即進程,該進程會自動啟動一個主線程,然后主線程去調用某個類的main方法,所以main方法運行在主線程中

4.在Java語言中實現(xiàn)多線程的兩種方式

第一種:

繼承 java.lang.Thread

重寫 run 方法

class Processor extends Thread{

public void run(){

System.out.println("helloworld");

}

}

第二種:

實現(xiàn) java.lang.Runnable

實現(xiàn) run 方法

class Processor1 implements Runnable{

public void run(){

System.out.println("helloworld");

}

}

5.UML圖描述線程的生命周期

JVM

6.線程的調度與控制

CPU在某個時刻只能執(zhí)行一條指令,線程只有得到CPU時間片,才能執(zhí)行命令

JVM負責線程的調度,取得CPU的時間片。優(yōu)先級高的線程獲取的CPU時間片相對多一些

ThreadTest01.java

Thread t1 = new Processor();//創(chuàng)建線程

t1.setName("t1");//給線程起名

t1.setPriority(5);//設置優(yōu)先級(由低到高1~10)

Thread t2 = new Processor();

t2.setName("t1");

t2.setPriority(10);

t1.start();//告訴JVM再分配一個新的棧給t線程,run不需程序員手動調用

t2.start();//系統(tǒng)線程啟動后自動調用run方法

7.線程阻塞(sleep)與終止(interrupt)

Thread.sleep(ms),是一個靜態(tài)方法,阻塞當前線程,騰出CPU,讓給其他線程

ThreadTest02.java

//依靠異常處理機制,3s后打斷線程的休眠

public class ThreadTest02 {

public static void main(String[] args) throws InterruptedException {

Thread t=new Thread(new Processor4());

t.setName("t");

t.start();

Thread.sleep(3000);

t.interrupt();//打斷t的休眠

}

}

class Processor4 implements Runnable{

@Override

public void run() {

try {Thread.sleep(100000);} catch (InterruptedException e) {}

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

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

}

}

}

ThreadTest03.java

//需求:更好的終止一個正在執(zhí)行的線程

public class ThreadTest03 {

public static void main(String[] args) throws InterruptedException {

Processor5 p =new Processor5();

Thread t=new Thread(p);

t.setName("t5");

t.start();

Thread.sleep(5000);

p.run=false;//終止

}

}

class Processor5 implements Runnable{

boolean run = true;//利用Boolean來控制

@Override

public void run() {

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

if(run){

try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}

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

}else{

return;//結束此方法

}

}

}

}

8.線程的同步(加鎖)important!

異步編程模型:t1線程執(zhí)行t1的,t2線程執(zhí)行t2的,兩線程之間誰也不等誰

同步編程模型:t1線程和t2線程執(zhí)行,t1必須等t2線程執(zhí)行結束后才能執(zhí)行

為什么要引入線程同步呢?

為了數(shù)據(jù)的安全。盡管應用程序的使用率降低,但是為了保證數(shù)據(jù)是安全的,必須加入線程同步機制。(線程同步機制讓程序等同于單線程)

什么條件下要使用線程同步?

必須是多線程環(huán)境

多線程環(huán)境共享同一個數(shù)據(jù)

共享的數(shù)據(jù)涉及到修改操作

模擬銀行取款場景(synchronized關鍵字也可直接添加到成員方法上)

原理:T1線程執(zhí)行到此處遇到synchronized關鍵字,就會去找this的對象鎖,找到則進入同步語句塊執(zhí)行程序,執(zhí)行完再歸還對象鎖

在T1線程執(zhí)行同步語句塊的過程中,若T2線程執(zhí)行到此處也遇到synchronized關鍵字,但未找到this的對象鎖,只能等待T1歸還

(synchronized添加到靜態(tài)方法上,線程執(zhí)行此方法時會找類鎖)

public void withdraw(double money){

//把需要同步的代碼放到同步語句塊中

synchronized(this){

double after = balance - money;

//延遲

try{Thread.sleep(1000);}catch(InterruptedException e){}

//更新

this.setBalance(after);

}

}

9.死鎖(DeadLock)

public class DeadLock {

public static void main(String[] args) {

Object o1 = new Object();

Object o2 = new Object();

Thread t1 = new Thread(new T1(o1,o2));

Thread t2 = new Thread(new T2(o1,o2));

t1.start();

t2.start();

}

}

class T1 implements Runnable{

Object o1;

Object o2;

T1(Object o1,Object o2){

this.o1=o1;

this.o2=o2;

}

public void run() {

synchronized(o1){

try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}

synchronized(o2){}

}

}

}

class T2 implements Runnable{

Object o1;

Object o2;

T2(Object o1,Object o2){

this.o1=o1;

this.o2=o2;

}

public void run() {

synchronized(o2){

try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}

synchronized(o1){}

}

}

}

總結

以上是生活随笔為你收集整理的java thread_Java(多线程Thread)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。