溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java怎么用兩個線程同時寫一個文件

發(fā)布時間:2021-09-01 16:06:29 來源:億速云 閱讀:132 作者:chen 欄目:編程語言

本篇內容介紹了“java怎么用兩個線程同時寫一個文件”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1.多線程

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

多線程的意義就在于使得一個應用程序有多條執(zhí)行路徑,從而提高進程(程序)的執(zhí)行效率。

2.JAVA中的多線程

2.1概述實現

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

JAVA程序的運行原理便是命令去啟動JVM,JVM會啟動一個進程,該進程會啟動一個主線程。然而JVM的啟動必然也是多線程的,一般情況下,它最低有兩個線程啟動了:主線程和垃圾回收線程。

2.2線程生命周期

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

2.3線程的優(yōu)先級

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

2.4線程的控制(常見方法)

1)休眠線程 2)加入線程 3)禮讓線程 4)后臺線程 5)終止線程

2.5多線程的安全問題

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

1)同步代碼塊

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

2)同步方法

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

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

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

PS:JDK5以后的針對線程的鎖定操作和釋放操作: Lock鎖。

3.多線程寫一個文件

如何實現多線程同時或讀或寫一個文件呢?我們都知道,一個文件在同一時間只能被一個線程讀(寫),如果要兩個線程同時寫一個文件,如何有效有序的分配這個臨界資源呢?

下面我將通過一個例子,闡述我的解決方法 -——沉睡喚醒機制。

需求:兩個線程寫一個TXT文件,線程1:I love you 線程2:so do I 。保證線程1、2有序執(zhí)行,一句I love you,對應一句so do I。

第一步,先創(chuàng)建WRFile類。這一步是關鍵的。

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(); } } //修改標記 喚醒線程 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(); } } //修改標記 喚醒線程 this.flag = false; this.notify(); } }

第二步,創(chuàng)建我們的兩個線程類,第一個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(); }  } }

第二個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方法啟動線程

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

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

“java怎么用兩個線程同時寫一個文件”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI