欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java兩個(gè)線程同時(shí)寫(xiě)一個(gè)文件

 更新時(shí)間:2019年08月29日 15:53:47   作者:Keozzz  
這篇文章主要為大家詳細(xì)介紹了java兩個(gè)線程同時(shí)寫(xiě)一個(gè)文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java兩個(gè)線程同時(shí)寫(xiě)一個(gè)文件的具體代碼,供大家參考,具體內(nèi)容如下

1.多線程   

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

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

2.JAVA中的多線程

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

JAVA實(shí)現(xiàn)多線程的方法有三種: 1)繼承Thread實(shí)現(xiàn)多線程。2)通過(guò)實(shí)現(xiàn)Runnable接口方式實(shí)現(xiàn)多線程。3)使用ExecutorService、Callable、Future實(shí)現(xiàn)有返回結(jié)果的多線程。這三種方法的具體實(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è)主線程。然而JVM的啟動(dòng)必然也是多線程的,一般情況下,它最低有兩個(gè)線程啟動(dòng)了:主線程和垃圾回收線程。

2.2線程生命周期

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

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

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

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

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

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

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

1)同步代碼塊

synchronized(對(duì)象)

{

 需要被同步的代碼塊
}

2)同步方法

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

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

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

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

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

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

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

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

第一步,先創(chuàng)建WRFile類。這一步是關(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)記 喚醒線程
 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)記 喚醒線程
 this.flag = false;
 this.notify();
 }
 
}

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • spring中向一個(gè)單例bean中注入非單例bean的方法詳解

    spring中向一個(gè)單例bean中注入非單例bean的方法詳解

    Spring是先將Bean對(duì)象實(shí)例化之后,再設(shè)置對(duì)象屬性,所以會(huì)先調(diào)用他的無(wú)參構(gòu)造函數(shù)實(shí)例化,每個(gè)對(duì)象存在一個(gè)map中,當(dāng)遇到依賴,就去map中調(diào)用對(duì)應(yīng)的單例對(duì)象,這篇文章主要給大家介紹了關(guān)于spring中向一個(gè)單例bean中注入非單例bean的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • SpringBoot2.x中management.security.enabled=false無(wú)效的解決

    SpringBoot2.x中management.security.enabled=false無(wú)效的解決

    這篇文章主要介紹了SpringBoot2.x中management.security.enabled=false無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java利用Poi讀取excel并對(duì)所有類型進(jìn)行處理

    Java利用Poi讀取excel并對(duì)所有類型進(jìn)行處理

    這篇文章主要為大家詳細(xì)介紹了Java利用Poi讀取excel并對(duì)所有類型進(jìn)行處理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-01-01
  • Java和c語(yǔ)言隨機(jī)數(shù)Random代碼詳細(xì)

    Java和c語(yǔ)言隨機(jī)數(shù)Random代碼詳細(xì)

    這篇文章主要介紹Java和c語(yǔ)言得隨機(jī)數(shù)Random,隨機(jī)數(shù)的用處在生活中比較少見(jiàn),但是用處并不少,比如一些小游戲的制作等等。下面我們就一起來(lái)學(xué)習(xí)這篇關(guān)于Java和c隨機(jī)數(shù)Random得文章吧
    2021-10-10
  • SpringMVC和rabbitmq集成的使用案例

    SpringMVC和rabbitmq集成的使用案例

    這篇文章主要介紹了SpringMVC和rabbitmq集成的使用案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解

    Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解

    這篇文章主要介紹了Springboot中使用Filter實(shí)現(xiàn)Header認(rèn)證詳解,當(dāng)在?web.xml?注冊(cè)了一個(gè)?Filter?來(lái)對(duì)某個(gè)?Servlet?程序進(jìn)行攔截處理時(shí),它可以決定是否將請(qǐng)求繼續(xù)傳遞給?Servlet?程序,以及對(duì)請(qǐng)求和響應(yīng)消息是否進(jìn)行修改,需要的朋友可以參考下
    2023-08-08
  • 關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問(wèn)題

    關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問(wèn)題

    這篇文章主要介紹了關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java代碼實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    Java代碼實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java代碼實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • spring動(dòng)態(tài)控制定時(shí)任務(wù)的實(shí)現(xiàn)

    spring動(dòng)態(tài)控制定時(shí)任務(wù)的實(shí)現(xiàn)

    在實(shí)際項(xiàng)目中,經(jīng)常需要?jiǎng)討B(tài)的控制定時(shí)任務(wù),比如通過(guò)接口增加、啟動(dòng)、停止、刪除定時(shí)任務(wù),本文主要介紹了spring動(dòng)態(tài)控制定時(shí)任務(wù)的實(shí)現(xiàn),感興趣的可以了解一下
    2024-01-01
  • 排序算法圖解之Java希爾排序

    排序算法圖解之Java希爾排序

    希爾排序是希爾(Donald?Shell)于1959年提出的一種排序算法,其也是一種特殊的插入排序,即將簡(jiǎn)單的插入排序進(jìn)行改進(jìn)后的一個(gè)更加高效的版本,也稱縮小增量排序。本文通過(guò)圖片和示例講解了希爾排序的實(shí)現(xiàn),需要的可以了解一下
    2022-11-11

最新評(píng)論