給你一個經(jīng)典的例子。run里面放空循環(huán)來觀察多線程是不合理的,空循環(huán)消耗時序極小,用sleep來間隔時間才是合理的。
在資中等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站制作 網(wǎng)站設(shè)計制作按需求定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷,外貿(mào)營銷網(wǎng)站建設(shè),資中網(wǎng)站建設(shè)費用合理。
class?RunnableDemo?implements?Runnable?{
private?Thread?t;
private?String?threadName;
RunnableDemo(?String?name)?{
threadName?=?name;
System.out.println("Creating?"?+??threadName?);
}
public?void?run()?{
System.out.println("Running?"?+??threadName?);
try?{
for(int?i?=?4;?i??0;?i--)?{
System.out.println("Thread:?"?+?threadName?+?",?"?+?i);
//?Let?the?thread?sleep?for?a?while.
Thread.sleep(50);
}
}catch?(InterruptedException?e)?{
System.out.println("Thread?"?+??threadName?+?"?interrupted.");
}
System.out.println("Thread?"?+??threadName?+?"?exiting.");
}
public?void?start?()?{
System.out.println("Starting?"?+??threadName?);
if?(t?==?null)?{
t?=?new?Thread?(this,?threadName);
t.start?();
}
}
}
public?class?TestThread?{
public?static?void?main(String?args[])?{
RunnableDemo?R1?=?new?RunnableDemo(?"Thread-1");
R1.start();
RunnableDemo?R2?=?new?RunnableDemo(?"Thread-2");
R2.start();
}???
}
可以同時運行。另外,你的類名最好是大寫;想要使用線程類,最好是實現(xiàn)Runnable接口。
一、 什么是多線程:
我們現(xiàn)在所使用操作系統(tǒng)都是多任務(wù)操作系統(tǒng)(早期使用的DOS操作系統(tǒng)為單任務(wù)操作系統(tǒng)),多任務(wù)操作指在同一時刻可以同時做多件事(可以同時執(zhí)行多個程序)。
多進程:每個程序都是一個進程,在操作系統(tǒng)中可以同時執(zhí)行多個程序,多進程的目的是為了有效的使用CPU資源,每開一個進程系統(tǒng)要為該進程分配相關(guān)的系統(tǒng)資源(內(nèi)存資源)
多線程:線程是進程內(nèi)部比進程更小的執(zhí)行單元(執(zhí)行流|程序片段),每個線程完成一個任務(wù),每個進程內(nèi)部包含了多個線程每個線程做自己的事情,在進程中的所有線程共享該進程的資源;
主線程:在進程中至少存在一個主線程,其他子線程都由主線程開啟,主線程不一定在其他線程結(jié)束后結(jié)束,有可能在其他線程結(jié)束前結(jié)束。Java中的主線程是main線程,是Java的main函數(shù);
二、 Java中實現(xiàn)多線程的方式:
繼承Thread類來實現(xiàn)多線程:
當我們自定義的類繼承Thread類后,該類就為一個線程類,該類為一個獨立的執(zhí)行單元,線程代碼必須編寫在run()方法中,run方法是由Thread類定義,我們自己寫的線程類必須重寫run方法。
run方法中定義的代碼為線程代碼,但run方法不能直接調(diào)用,如果直接調(diào)用并沒有開啟新的線程而是將run方法交給調(diào)用的線程執(zhí)行
要開啟新的線程需要調(diào)用Thread類的start()方法,該方法自動開啟一個新的線程并自動執(zhí)行run方法中的內(nèi)容
請點擊輸入圖片描述
結(jié)果:
請點擊輸入圖片描述
java多線程的啟動順序不一定是線程執(zhí)行的順序,各個線程之間是搶占CPU資源執(zhí)行的,所有有可能出現(xiàn)與啟動順序不一致的情況。
CPU的調(diào)用策略:
如何使用CPU資源是由操作系統(tǒng)來決定的,但操作系統(tǒng)只能決定CPU的使用策略不能控制實際獲得CPU執(zhí)行權(quán)的程序。
線程執(zhí)行有兩種方式:
1.搶占式:
目前PC機中使用最多的一種方式,線程搶占CPU的執(zhí)行權(quán),當一個線程搶到CPU的資源后并不是一直執(zhí)行到此線程執(zhí)行結(jié)束,而是執(zhí)行一個時間片后讓出CPU資源,此時同其他線程再次搶占CPU資源獲得執(zhí)行權(quán)。
2.輪循式;
每個線程執(zhí)行固定的時間片后讓出CPU資源,以此循環(huán)執(zhí)行每個線程執(zhí)行相同的時間片后讓出CPU資源交給下一個線程執(zhí)行。
希望對您有所幫助!~
我用的是方法鎖,這是用Android?Studio測試類寫的,自己寫個Main函數(shù),復(fù)制里面的方法,然后調(diào)用
/**
*?Created?by?Svnt?on?2016-09-26.
*/
public?class?MyApplication?extends?ApplicationTest{
public?void?testThread(){
MyRunnable?myRunnable?=?new?MyRunnable();
//線程并發(fā)
new?Thread(myRunnable,"A").start();
new?Thread(myRunnable,"B").start();
new?Thread(myRunnable,"C").start();
}
}
/**
*?存錢的(Runnable)線程
*/
class?MyRunnable?implements?Runnable?{
double?mMoney;
@Override
public?synchronized?void?run()?{
for?(int?i?=?0?;?i??3;?i++){
mMoney?+=?1000;
Log.e("-main-",Thread.currentThread().getName()+"余額剩余?=?"+mMoney);
}
}
}
首先,你同步的是具體的某個Test實例, 對于那個實例來說,實際上只有一個線程訪問了那個代碼塊,但是sum和other卻是多個線程同時去進行訪問,實際上這是不安全的,如果你想實現(xiàn)每次都輸出10000的效果,那么正確的應(yīng)該是在Test.class上加鎖,而不是獲取Test實例的鎖,修改后的代碼如下:
public?class?Test?extends?Thread?{
public?static?int?sum?=?10000;
public?static?int?other?=?0;
public?void?getMoney()?{
synchronized?(Test.class)?{
System.out.println(Thread.currentThread().getName()?+?"?開始執(zhí)行");
sum?=?sum?-?100;
System.out.println("sum-100");
other?=?other?+?100;
System.out.println("other+100");
System.out.println(sum?+?other);
System.out.println(Thread.currentThread().getName()?+?"?執(zhí)行完成");
}
}
public?void?run()?{
getMoney();
}
public?static?void?main(String[]?agrs)?{
Thread?t[]?=?new?Thread[10];
for?(int?i?=?0;?i?=?9;?i++)?{
t[i]?=?new?Test();
t[i].start();
}
}
}
// 上面代碼能得到你的結(jié)果
Java 給多線程編程提供了內(nèi)置的支持。 一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。
新建狀態(tài):
使用 new 關(guān)鍵字和 Thread 類或其子類建立一個線程對象后,該線程對象就處于新建狀態(tài)。它保持這個狀態(tài)直到程序 start() 這個線程。
就緒狀態(tài):
當線程對象調(diào)用了start()方法之后,該線程就進入就緒狀態(tài)。就緒狀態(tài)的線程處于就緒隊列中,要等待JVM里線程調(diào)度器的調(diào)度。
運行狀態(tài):
如果就緒狀態(tài)的線程獲取 CPU 資源,就可以執(zhí)行 run(),此時線程便處于運行狀態(tài)。處于運行狀態(tài)的線程最為復(fù)雜,它可以變?yōu)樽枞麪顟B(tài)、就緒狀態(tài)和死亡狀態(tài)。
阻塞狀態(tài):
如果一個線程執(zhí)行了sleep(睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運行狀態(tài)進入阻塞狀態(tài)。在睡眠時間已到或獲得設(shè)備資源后可以重新進入就緒狀態(tài)。可以分為三種:
等待阻塞:運行狀態(tài)中的線程執(zhí)行 wait() 方法,使線程進入到等待阻塞狀態(tài)。
同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為同步鎖被其他線程占用)。
其他阻塞:通過調(diào)用線程的 sleep() 或 join() 發(fā)出了 I/O 請求時,線程就會進入到阻塞狀態(tài)。當sleep() 狀態(tài)超時,join() 等待線程終止或超時,或者 I/O 處理完畢,線程重新轉(zhuǎn)入就緒狀態(tài)。
死亡狀態(tài):
一個運行狀態(tài)的線程完成任務(wù)或者其他終止條件發(fā)生時,該線程就切換到終止狀態(tài)。
本文標題:java多線程編程代碼 java多線程網(wǎng)絡(luò)編程
本文鏈接:http://m.rwnh.cn/article16/doojpgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、服務(wù)器托管、虛擬主機、微信小程序、定制網(wǎng)站、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)