中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

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

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

站在用戶的角度思考問題,與客戶深入溝通,找到邕寧網(wǎng)站設(shè)計(jì)與邕寧網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋邕寧地區(qū)。

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)通過實(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)死亡

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

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

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

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

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

2.5多線程的安全問題

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

1)同步代碼塊

synchronized(對(duì)象)

{

 需要被同步的代碼塊
}

2)同步方法

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

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

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

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

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

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

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

需求:兩個(gè)線程寫一個(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 th2 = new Thread(ft);
 Thread th3 = new Thread(st);
 //啟動(dòng)線程
 th2.start();
 th3.start();
 }
 
}

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

分享名稱:java兩個(gè)線程同時(shí)寫一個(gè)文件
標(biāo)題URL:http://www.rwnh.cn/article36/jdgspg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站云服務(wù)器、靜態(tài)網(wǎng)站、營銷型網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、網(wǎng)頁設(shè)計(jì)公司

廣告

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

手機(jī)網(wǎng)站建設(shè)
陆河县| 晋宁县| 于都县| 郴州市| 井研县| 顺昌县| 河池市| 娄底市| 渝中区| 西丰县| 会泽县| 河北省| 万山特区| 龙南县| 漠河县| 长岭县| 平阳县| 汝城县| 涿鹿县| 元谋县| 峨山| 北票市| 临朐县| 张掖市| 闵行区| 南昌县| 澄迈县| 榆社县| 且末县| 吴忠市| 金沙县| 大邑县| 海南省| 南昌市| 淳安县| 芦山县| 新闻| 罗山县| 东乡县| 固原市| 鄄城县|