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執行多次後會出錯;