1. 程式人生 > >JAVA多執行緒之兩個執行緒同時寫一個檔案

JAVA多執行緒之兩個執行緒同時寫一個檔案

1.多執行緒   

    執行緒是程式執行流的最小單元。是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒,同一程序中的多個執行緒之間可以併發執行。由於執行緒之間的相互制約,致使執行緒在執行中呈現出間斷性。執行緒也有就緒、阻塞和執行三種基本狀態。就緒狀態是指執行緒具備執行的所有條件,邏輯上可以執行,在等待處理機;執行狀態是指執行緒佔有處理機正在執行;阻塞狀態是指執行緒在等待一個事件(如某個訊號量),邏輯上不可執行。每一個程式都至少有一個執行緒,若程式只有一個執行緒,那就是程式本身。  
    多執行緒的意義就在於使得一個應用程式有多條執行路徑,從而提高程序(程式)的執行效率。

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執行緒的優先順序

    執行緒的排程有兩種方式:1)分時排程。2)搶佔式排程。JAVA採用的是後者,預設情況下,執行緒去搶佔資源(CPU執行權)。我們可以通過setPriority方法,設定執行緒的優先順序,預設是5,範圍為1-10。但是一般情況下,光是設定執行緒的優先順序,不能使得執行緒有序且高效執行,所以我們還需要學習更多的方法與原理機制。

2.4執行緒的控制(常見方法)

1)休眠執行緒        2)加入執行緒        3)禮讓執行緒        4)後臺執行緒        5)終止執行緒

2.5多執行緒的安全問題

    在多執行緒的環境下,大多時候都是會共享資料,存在多條語句操作共享資料,這樣很多時候會出現髒資料。所以為了解決執行緒的安全的問題,我們可以通過synchronized同步鎖物件達到我們的目的。

1)同步程式碼塊

synchronized(物件)

{

    需要被同步的程式碼塊

}

2)同步方法

把同步加在方法上,這裡的鎖物件是this。

3)靜態同步方法

把同步加在方法上。這裡的鎖是當前類的位元組碼檔案。

PS:JDK5以後的針對執行緒的鎖定操作和釋放操作: Lock鎖。

3.多執行緒寫一個檔案

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

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

    需求:兩個執行緒寫一個TXT檔案,執行緒1:I love you  執行緒2:so do I 。保證執行緒1、2有序執行,一句I love you,對應一句so do I。

第一步,先建立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();
	}

}


第二步,建立我們的兩個執行緒類,第一個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) {
		//建立資料物件
		WRFile wr = new WRFile();
		//設定和獲取類
		FirstThread ft = new FirstThread(wr);
		SecondThrad st = new SecondThrad(wr);
		//執行緒類
		Thread th1 = new Thread(ft);
		Thread th2 = new Thread(st);
		//啟動執行緒
		th1.start();
		th2.start();
	}

}

即可實現兩個執行緒同時(有序)寫一個檔案,兩個以上,或是其他操作也可參考這種思想去實現。

有不對的地方,還望大神們,多多指教。

相關推薦

JAVA執行執行同時一個檔案

1.多執行緒        執行緒是程式執行流的最小單元。是程序中的一個實體,是被系統獨立排程和分派的基本單位,執行緒自己不擁有系統資源,只擁有一點兒在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的全部資源。一個執行緒可以建立和撤消另一個執行緒,同一程序中的多個執行緒之間可以併發執行

Java 執行程式設計執行實現一個執行列印奇數,另一個執行列印偶數”

題目:t從0到N,一個執行緒列印奇數,一個執行緒列印偶數,按順序打印出來。            最終列印結果:0,1,2,3,4,...,N;            思路:兩個執行緒間的通訊採用等待,喚醒方法——列印奇偶數由flag控制,當flag為真時列印偶數; 列

執行同步——執行序列順序列印奇數和偶數的種實現

題目:一道經典的執行緒併發的問題,執行緒a列印1、3、5……,執行緒b列印2、4、6……,兩個執行緒交替執行輸出1、2、3、4、5、6…… 要點: package com.test; import java.util.concurrent.locks.

執行(二)Java執行,啟動四執行執行加一,另外執行減一

  public class Test { public static void main(String[] args) { final ShareData data = new ShareData(); for (int i = 0; i < 2; i++) {

java執行-Thread執行交換資料Exchanger

/** * 2017-4-21 * author:饒為 * Administrator */package Thread;import java.util.concurrent.Exchanger;/** * 2017-4-21 * author:饒為 * Administrator */public cla

Java執行-51-執行之間的通訊

這篇來學習Object類下兩個方法,分別是wait()和notify(), 這兩個方法是在多執行緒中設定執行緒等待和喚醒執行緒的作用。這篇,通過兩個執行緒的例子來學習wait()執行緒等待方法和notify()喚醒執行緒方法。 1.兩個執行緒,列印兩句話。 前面文章,有類似下面

Java小題目執行順序列印A、B

1、問題描述 使用Java多執行緒方式來實現迴圈列印A、B,並保證不亂序。 2、解決方案 java在編寫多執行緒程式時,為了保證執行緒安全,需要對資料同步,經常用到兩種同步方式就是Synchronized和重入鎖ReentrantLock。 利用syn

JAVA基礎(2) -- 執行輪流列印1-100

思路:宣告一個全域性變數int i = 1;然後將這個變數鎖定,執行緒輪流訪問這個變數,並列印即可。 程式碼如下: package cn.taneroom.test; public class Th

運用執行實現執行+1,執行-1;執行安全+內部類

public class Test { public int j = 0; public static void main(String[] args) { Test lx = new Test(); Add add = lx.new A

關於Spring容器中定時器到時執行會出現執行同時執行的問題

最近公司有一個小需求,是需要定時去從某一個視訊供應商下載視訊檔案,問題很簡單,直接使用quartz,編寫相應的定時器程式碼,同時配置相應的定時器時間,但是在定時執行之後會出現兩個執行緒同時執行定時任務的問題,並且這兩個執行緒併發執行,從而一直影響到視訊檔案下載。

一個NumPy模組就要學這麼?師傅發月就整理了一個模組資料

  一、NumPy簡介 其官網是: http://www.numpy.org/ NumPy是Python語言的一個擴充程式庫。支援高階大量的維度陣列與矩陣運算,此外也針對陣列運算提供大量的數學函式庫。Numpy內部解除了Python的GIL(全域性直譯器鎖),執

根據陣列元素個數一樣,元素一樣,那麼陣列一樣,一個實現。

OK!實現,實現,實現。Method1:抓住兩個陣列比較的核心,A陣列每個元素與B陣列中元素依次進行比較,分為3(array.length)輪,在兩個陣列長度相等的情況下,只要任意一輪全匹配不上,那麼兩個陣列不一樣。public static void main(Strin

java執行操作資料庫.

package com.dinglin; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; i

Java 執行中。執行交替執行一個輸出偶數,一個輸出奇數(方法二)

package com.up366.thread.example; import java.util.concurrent.Semaphore; /** * Java 多執行緒中。兩個執行緒交替執

Java 執行中。執行交替執行一個輸出偶數,一個輸出奇數(方法一)

public class DigitPrinterExample { public static void main(String[] args) { Number num =

JAVA執行設計4執行,其中執行每次對j增加1,另外執行對j每次減少1。

最新在看一些執行緒方面的問題,也找一些題目來練手,看到一套題,JAVA設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒

Java執行interrupt()和執行終止方式

1. interrupt()說明 在介紹終止執行緒的方式之前,有必要先對interrupt()進行了解。 關於interrupt(),java的djk文件描述如下:http://docs.oracle.com/javase/7/docs/api/ Interrupts this thread

執行——設計4執行,其中執行每次對j增加1,另外執行對j每次減少1。出程式。

package com.com.aaa.addreduceThread; public class ThreadDemo { private int j=1; //每次新增1

java執行callable+Executor執行池例項

package main.java; import java.sql.Time; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.con

執行--4視窗售200張票

技能點: 1.如何保證執行緒是多執行緒執行,而且不出現負票? 第一個while判斷是外部判斷,用於保持售票;而且在while迴圈中嵌入synchronized (){}是慣用方法,如果此處把while換為if執行多次後會出錯;