java怎么用兩個(gè)線(xiàn)程同時(shí)寫(xiě)一個(gè)文件-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“java怎么用兩個(gè)線(xiàn)程同時(shí)寫(xiě)一個(gè)文件”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)主要從事網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)公司、程序開(kāi)發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信平臺(tái)小程序開(kāi)發(fā)等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷(xiāo)經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷(xiāo)、管理等多方位專(zhuān)業(yè)化運(yùn)作于一體。

1.多線(xiàn)程

線(xiàn)程是程序執(zhí)行流的最小單元。是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線(xiàn)程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線(xiàn)程共享進(jìn)程所擁有的全部資源。一個(gè)線(xiàn)程可以創(chuàng)建和撤消另一個(gè)線(xiàn)程,同一進(jìn)程中的多個(gè)線(xiàn)程之間可以并發(fā)執(zhí)行。由于線(xiàn)程之間的相互制約,致使線(xiàn)程在運(yùn)行中呈現(xiàn)出間斷性。線(xiàn)程也有就緒、阻塞和運(yùn)行三種基本狀態(tài)。就緒狀態(tài)是指線(xiàn)程具備運(yùn)行的所有條件,邏輯上可以運(yùn)行,在等待處理機(jī);運(yùn)行狀態(tài)是指線(xiàn)程占有處理機(jī)正在運(yùn)行;阻塞狀態(tài)是指線(xiàn)程在等待一個(gè)事件(如某個(gè)信號(hào)量),邏輯上不可執(zhí)行。每一個(gè)程序都至少有一個(gè)線(xiàn)程,若程序只有一個(gè)線(xiàn)程,那就是程序本身。

多線(xiàn)程的意義就在于使得一個(gè)應(yīng)用程序有多條執(zhí)行路徑,從而提高進(jìn)程(程序)的執(zhí)行效率。

2.JAVA中的多線(xiàn)程

2.1概述實(shí)現(xiàn)

JAVA實(shí)現(xiàn)多線(xiàn)程的方法有三種: 1)繼承Thread實(shí)現(xiàn)多線(xiàn)程。2)通過(guò)實(shí)現(xiàn)Runnable接口方式實(shí)現(xiàn)多線(xiàn)程。3)使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線(xiàn)程。這三種方法的具體實(shí)現(xiàn),在此先不一一贅述,網(wǎng)上有很多有關(guān)的博客,不明白的朋友可以去看看。

JAVA程序的運(yùn)行原理便是命令去啟動(dòng)JVM,JVM會(huì)啟動(dòng)一個(gè)進(jìn)程,該進(jìn)程會(huì)啟動(dòng)一個(gè)主線(xiàn)程。然而JVM的啟動(dòng)必然也是多線(xiàn)程的,一般情況下,它最低有兩個(gè)線(xiàn)程啟動(dòng)了:主線(xiàn)程和垃圾回收線(xiàn)程。

2.2線(xiàn)程生命周期

1)新建 2)就緒 3)運(yùn)行 4)阻塞 5)死亡

2.3線(xiàn)程的優(yōu)先級(jí)

線(xiàn)程的調(diào)度有兩種方式:1)分時(shí)調(diào)度。2)搶占式調(diào)度。JAVA采用的是后者,默認(rèn)情況下,線(xiàn)程去搶占資源(CPU執(zhí)行權(quán))。我們可以通過(guò)setPriority方法,設(shè)置線(xiàn)程的優(yōu)先級(jí),默認(rèn)是5,范圍為1-10。但是一般情況下,光是設(shè)置線(xiàn)程的優(yōu)先級(jí),不能使得線(xiàn)程有序且高效執(zhí)行,所以我們還需要學(xué)習(xí)更多的方法與原理機(jī)制。

2.4線(xiàn)程的控制(常見(jiàn)方法)

1)休眠線(xiàn)程 2)加入線(xiàn)程 3)禮讓線(xiàn)程 4)后臺(tái)線(xiàn)程 5)終止線(xiàn)程

2.5多線(xiàn)程的安全問(wèn)題

在多線(xiàn)程的環(huán)境下,大多時(shí)候都是會(huì)共享數(shù)據(jù),存在多條語(yǔ)句操作共享數(shù)據(jù),這樣很多時(shí)候會(huì)出現(xiàn)臟數(shù)據(jù)。所以為了解決線(xiàn)程的安全的問(wèn)題,我們可以通過(guò)synchronized同步鎖對(duì)象達(dá)到我們的目的。

1)同步代碼塊

synchronized(對(duì)象){ 需要被同步的代碼塊}

2)同步方法

把同步加在方法上,這里的鎖對(duì)象是this。

3)靜態(tài)同步方法

把同步加在方法上。這里的鎖是當(dāng)前類(lèi)的字節(jié)碼文件。

PS:JDK5以后的針對(duì)線(xiàn)程的鎖定操作和釋放操作: Lock鎖。

3.多線(xiàn)程寫(xiě)一個(gè)文件

如何實(shí)現(xiàn)多線(xiàn)程同時(shí)或讀或?qū)懸粋€(gè)文件呢?我們都知道,一個(gè)文件在同一時(shí)間只能被一個(gè)線(xiàn)程讀(寫(xiě)),如果要兩個(gè)線(xiàn)程同時(shí)寫(xiě)一個(gè)文件,如何有效有序的分配這個(gè)臨界資源呢?

下面我將通過(guò)一個(gè)例子,闡述我的解決方法 -——沉睡喚醒機(jī)制。

需求:兩個(gè)線(xiàn)程寫(xiě)一個(gè)TXT文件,線(xiàn)程1:I love you 線(xiàn)程2:so do I 。保證線(xiàn)程1、2有序執(zhí)行,一句I love you,對(duì)應(yīng)一句so do I。

第一步,先創(chuàng)建WRFile類(lèi)。這一步是關(guān)鍵的。

package cn.Thread.love; import java.io.FileNotFoundException;import java.io.IOException;import java.io.RandomAccessFile; public class WRFile { //String str; boolean flag; public WRFile() {  } public synchronized void read1() { if(this.flag) { try { this.wait(); } catch (InterruptedException e) {  e.printStackTrace(); } } RandomAccessFile ra = null; try { ra = new RandomAccessFile("love.txt", "rw"); ra.seek(ra.length());  ra.writeBytes("I love you"); ra.writeBytes("\r\n"); } catch (Exception e) {  e.printStackTrace(); } finally { try { ra.close(); } catch (IOException e) {  e.printStackTrace(); } } //修改標(biāo)記 喚醒線(xiàn)程 this.flag = true; this.notify(); } public synchronized void read2() { if(!this.flag) { try { this.wait(); } catch (InterruptedException e) {  e.printStackTrace(); } } RandomAccessFile ra = null; try { ra = new RandomAccessFile("love.txt", "rw"); ra.seek(ra.length());  ra.writeBytes("so do I"); ra.writeBytes("\r\n"); } catch (Exception e) {  e.printStackTrace(); } finally { try { ra.close(); } catch (IOException e) {  e.printStackTrace(); } } //修改標(biāo)記 喚醒線(xiàn)程 this.flag = false; this.notify(); } }

第二步,創(chuàng)建我們的兩個(gè)線(xiàn)程類(lèi),第一個(gè)FirstThread。

package cn.Thread.love; public class FirstThread implements Runnable {private WRFile wr = new WRFile();  public FirstThread(WRFile wr) { this.wr = wr; }  @Override public void run() {  while(true) { wr.read1(); }  } }

第二個(gè)SecondThread

package cn.Thread.love; public class SecondThrad implements Runnable{ private WRFile wr = new WRFile(); public SecondThrad(WRFile wr) { this.wr = wr; } @Override public void run() { while(true) { wr.read2(); } }  }

第三步,main方法啟動(dòng)線(xiàn)程

package cn.Thread.love; public class LoveDemo {  public static void main(String[] args) { //創(chuàng)建數(shù)據(jù)對(duì)象 WRFile wr = new WRFile(); //設(shè)置和獲取類(lèi) FirstThread ft = new FirstThread(wr); SecondThrad st = new SecondThrad(wr); //線(xiàn)程類(lèi) Thread th2 = new Thread(ft); Thread th3 = new Thread(st); //啟動(dòng)線(xiàn)程 th2.start(); th3.start(); } }

即可實(shí)現(xiàn)兩個(gè)線(xiàn)程同時(shí)(有序)寫(xiě)一個(gè)文件,兩個(gè)以上,或是其他操作也可參考這種思想去實(shí)現(xiàn)。

“java怎么用兩個(gè)線(xiàn)程同時(shí)寫(xiě)一個(gè)文件”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

本文標(biāo)題:java怎么用兩個(gè)線(xiàn)程同時(shí)寫(xiě)一個(gè)文件-創(chuàng)新互聯(lián)
鏈接URL:http://bm7419.com/article18/ipidp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、品牌網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)