java thread_Java(多线程Thread)
畢設遇到些問題,猜想可能與多線程有關聯,所以花了幾天時間學習了多線程,在此小結一番
1.進程與多進程
一個進程對應一個應用程序。在java的開發環境下啟動JVM,就表示啟動了一個進程。在同一個操作系統中,可以啟動多個進程
對于單核計算機來講,在同一個時間點上運行了游戲進程和音樂進程,但實際二者并不是同時運行
而計算機的CPU在某個時間點上只能做一件事,所以計算機在 游戲進程 和 音樂進程 之間頻繁的切換執行,由于切換速度極高,所以人類感覺兩者在同時進行
多進程的作用不是提高執行速度,而是提高CPU的使用率
進程和進程之間的內存是獨立的
2.線程與多線程
線程是一個進程中的執行場景。一個進程可以啟動多個線程
多線程作用不是為了提高執行速度,而是提高應用程序的使用率
線程和線程共享“堆內存和方法區內存”,棧內存是獨立的,一個線程一個棧
由于多線程在來回切換,所以給現實世界中的人類一種錯覺:感覺多個線程在同時并發執行。
3.關于Java程序的運行原理
java命令會啟動JVM,等于啟動了一個應用程序即進程,該進程會自動啟動一個主線程,然后主線程去調用某個類的main方法,所以main方法運行在主線程中
4.在Java語言中實現多線程的兩種方式
第一種:
繼承 java.lang.Thread
重寫 run 方法
class Processor extends Thread{
public void run(){
System.out.println("helloworld");
}
}
第二種:
實現 java.lang.Runnable
實現 run 方法
class Processor1 implements Runnable{
public void run(){
System.out.println("helloworld");
}
}
5.UML圖描述線程的生命周期
JVM
6.線程的調度與控制
CPU在某個時刻只能執行一條指令,線程只有得到CPU時間片,才能執行命令
JVM負責線程的調度,取得CPU的時間片。優先級高的線程獲取的CPU時間片相對多一些
ThreadTest01.java
Thread t1 = new Processor();//創建線程
t1.setName("t1");//給線程起名
t1.setPriority(5);//設置優先級(由低到高1~10)
Thread t2 = new Processor();
t2.setName("t1");
t2.setPriority(10);
t1.start();//告訴JVM再分配一個新的棧給t線程,run不需程序員手動調用
t2.start();//系統線程啟動后自動調用run方法
7.線程阻塞(sleep)與終止(interrupt)
Thread.sleep(ms),是一個靜態方法,阻塞當前線程,騰出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
//需求:更好的終止一個正在執行的線程
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線程執行t1的,t2線程執行t2的,兩線程之間誰也不等誰
同步編程模型:t1線程和t2線程執行,t1必須等t2線程執行結束后才能執行
為什么要引入線程同步呢?
為了數據的安全。盡管應用程序的使用率降低,但是為了保證數據是安全的,必須加入線程同步機制。(線程同步機制讓程序等同于單線程)
什么條件下要使用線程同步?
必須是多線程環境
多線程環境共享同一個數據
共享的數據涉及到修改操作
模擬銀行取款場景(synchronized關鍵字也可直接添加到成員方法上)
原理:T1線程執行到此處遇到synchronized關鍵字,就會去找this的對象鎖,找到則進入同步語句塊執行程序,執行完再歸還對象鎖
在T1線程執行同步語句塊的過程中,若T2線程執行到此處也遇到synchronized關鍵字,但未找到this的對象鎖,只能等待T1歸還
(synchronized添加到靜態方法上,線程執行此方法時會找類鎖)
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uilabel 自行撑开高度_UILab
- 下一篇: 提示重置失败未做更改怎么办 重置失败未做