1. 程式人生 > >Java高併發程式碼篇

Java高併發程式碼篇

一、建立執行緒: 

package com.dong.testThread;
/**
 * 
 * 1.執行緒的建立
 * 2.執行緒的方法
 * 
 * @author liuD
 *
 */
public class MultiThread {
	public static void main(String[] args) throws InterruptedException {
		//建立執行緒1,使用實現Runnable介面的類,使用lambda表示式;
		Thread  trl =new Thread(() -> System.out.println(Thread.currentThread().getName()+ " thread start..."));
		trl.start();
		//使用實現Runnable介面的類,不使用lambda表示式;
		Thread tr = new Thread(new runnableExam());
		tr.start();
		//建立執行緒2,使用繼承了Thread類來建立執行緒,使用預設的run()
		Thread th = new Thread();
		th.start();
		//建立執行緒3,使用繼承了Thread類的例項做引數。使用重寫的run()
		Thread th2 =new Thread(new threadExam());
		
	}
}
class threadExam extends Thread{
	public void run() {
		System.out.println(Thread.currentThread().getName()+ " thread2 start ...");
	}
}
class runnableExam implements Runnable{
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+ " thread start ...");
	}
	
}

二、執行緒的各個狀態:

⑴新建: new()

package com.dong.testThread;
/**
 * 執行緒的new狀態,即剛建立的執行緒
 * @author liuD
 */
public class TestNew {
	public static void main(String[] args) {
		//使用lambda建立執行緒;
		Thread t = new Thread(
				() -> System.out.println(Thread.currentThread().getName() + " will running")
				);
	}
}

⑵睡眠:sleep()

package com.dong.testThread;
/**
 * 測試Sleep功能,Sleep是讓執行緒等待million毫秒後在執行
 * @author liuD
 */
public class TestSleep extends Thread{
	StringBuilder str = new StringBuilder();
	public static void main(String[] args) throws InterruptedException {
		Thread thread = new Thread(new TestSleep());
		long startTime  = System.currentTimeMillis();
		//⑵執行緒睡眠2秒
		thread.sleep(2000);
		long sleepTime  = System.currentTimeMillis();
		//注意這個結果不一定是2000
		System.out.println("thread has sleep "+ (sleepTime - startTime )+ " finish and will start ");
		thread.start();
	}
	public void run(){
		for(int i = 0 ;i< 10;i++) {
			str.append(".");
			System.out.println(str.toString());
		}
	}
}

⑶停止:stop()  (不建議使用)

package com.dong.testThread;
/**
 * 測試stop方法,stop方法會立刻釋放鎖資源,可能導致資料的不一致;
 * 
 * @author liuD
 *
 */
public class testStop {
	public static void main(String[] args) throws InterruptedException {
		new ReadObjectThread().start();
		while(true) {
			Thread t = new ChangeObjectThread();
			t.start();
			Thread.sleep(100);
			//呼叫stop()方法;
			t.stop();
		}
	}
}
class User{
	static int a = 0;
	static int b = 0;
	
	public static int getA() {
		return a;
	}
	public static int getB() {
		return b;
	}
	public static void setA() {
		a = a + 1;
	}
	public static void steB() {
		b = b + 1;
	}
}
class  ChangeObjectThread extends Thread{
	public  void run() {
		while(true) {
			synchronized(User.class) {
				User.setA();
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				User.steB();
			}
			Thread.yield();
		}
	}
}
class ReadObjectThread extends Thread{
	public void run() {
		while(true) {
			synchronized(User.class) {
				if(User.getA() != User.getB()) {
					System.out.println( "A = "+  User.getA() + " B = " + User.getB());
				}
			}
			Thread.yield();
		}
	}
}

⑷中斷:interrupte()

package com.dong.testThread;
/**
 * 測試interrupte()方法
 * 當呼叫interrupte()方法,會給執行緒傳送一個通知,告訴目標執行緒,該退出,至於如何退出,有目標執行緒自行決定;
 * interrrupte會通知目標執行緒中斷,也就是設定中斷標誌位,中斷標誌位表示當前執行緒已經被中斷了。
 * 剛呼叫interrupte()方法,相當於只設置了中斷標誌,但是這個中斷不會發生任何作用;
 *如果想顯示終止執行緒,可以使用Thread.currentThread().isInterrupted()方法,判斷執行緒是否已經中斷,可以顯式中斷執行緒;
 * @author liuD
 *
 */
public class TestInterrupt {
	public static void main(String[] args) throws InterruptedException {
		Thread thread = new Thread(new TThread());
		thread.start();
		thread.sleep(2000);
		//執行緒的中斷不確定,設定了中斷標誌
		thread.interrupt();
		
		Thread tot = new Thread(new ToThread());
		tot.start();
		//執行緒的中斷不確定,只是設定了中斷標誌
		tot.interrupt();
	}
}
class TThread implements Runnable{
	@Override
	public void run() {
		while(true) {
			//判斷執行緒是否被中斷,顯式中斷執行緒的執行;
			if(Thread.currentThread().isInterrupted()) {
				System.out.println(" Interrupted !!! ");
				break;
			}
			System.out.println("TT -----this is thread ...");
		}
		Thread.yield();
	}
}
class ToThread implements Runnable {
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			System.out.println("ToT-----this is thread ...");
		}
	}
	
}

⑸等待:wait()   

⑹喚醒:notify()

package com.dong.testThread;
/**
 * wait()方法和notify()方法是在object類中定義的,
 * wait()讓當然執行緒等待,進入鎖物件的等待佇列,直到有執行緒呼叫notify()方法,才會從等待佇列中隨機選擇一個等待執行緒進行喚醒,
 * notify()方法從等待佇列總隨機選擇一個執行緒進行喚醒;
 * @author liuD
 *
 */
public class TestWaitAndNotify {
	final static Object object = new Object();
	public static void main(String[] args) {
		Thread t1  = new Thread(new ToThreads());
		t1.start();
		Thread t2 = new Thread(new ToT2Threads());
		t2.start();
	}

static class ToThreads implements Runnable{
	@Override
	public void run() {
		synchronized (object) {
			System.out.println(System.currentTimeMillis()+ " : T1 start ");
			try {
				System.out.println(System.currentTimeMillis()+": T1 wait for object" );
				object.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(System.currentTimeMillis()+": T1 end !");
		}
	}	
}
static class ToT2Threads implements Runnable{
	public void run() {
		synchronized(object) {
			System.out.println(System.currentTimeMillis()+ " :T2 start notify one thread");
			object.notify();
			System.out.println(System.currentTimeMillis()+ " : T2 end! ");			
			try {
				Thread.sleep(2000);
			}catch(InterruptedException e) {}
		}
	}
	}
}

⑻謙讓:yield

package com.dong.testThread;
/**
 * yield()方法會讓當前執行緒讓出Cpu的執行權,停止執行,從而重新爭取cpu的資源,
 * @author liuD
 */
public class testYield {
	public static void main(String[] args) {
		Thread t1 = new Thread(new T1());
		Thread t2 = new Thread(new T2());
		//多個執行緒之間的執行是隨機的,因此使用yield()方法,看不出來謙讓的效果,所以設定一個高優先順序和低優先順序執行緒,來觀察yield()的效果
		t1.setPriority(10);
		t2.setPriority(1);
		t1.start();
		//可以註釋掉t1.yield()語句,來觀察輸出結果之間的變化;
		t1.yield();
		t2.start();
	}
}
class T1 implements Runnable{
	@Override
	public void run() {
		for(int i = 0;i<20;i++) {
			System.out.println("i \' am a brothers");
		}
	}
}
class T2 implements Runnable{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int j =0;j<20;j++) {
			System.out.println("I \' am a sister");
		}
	}
}

⑼加入:join

package com.dong.testThread;
/**
 * 
 * yield()方法,它會阻塞當前執行緒,直到目標執行緒執行完畢,
 * @author liuD
 */
public class TestJoin {
	public static void main(String[] args) throws InterruptedException {
		Thread t1 = new Thread(new joinThread());
		t1.start();
		//阻塞主執行緒,其他執行緒願意等待t1執行緒執行完畢在執行,這裡其他執行緒指主執行緒,如果沒有t1.join(),則兩個執行緒的輸出語句就會隨機輸出		
		t1.join();
		for(int i = 0 ;i< 1000;i++) {
			System.out.println(Thread.currentThread().getName() +" : " + i);
		}
	}
}
class joinThread implements Runnable{
	public void run() {
		for(int j = 0 ;j < 3;j++) {
		System.out.println(Thread.currentThread().getName()+ " :  start start start " );
		}
	}
}

⑽執行:start

就是建立執行緒後,啟動啟動執行緒的方法,threadObject.start()方法;

部分程式碼參考《Java 高併發程式設計》  --葛一鳴,郭超 ,,由衷感謝此書作者為我們提供學習內容

相關推薦

Java併發程式碼

一、建立執行緒:  package com.dong.testThread; /** * * 1.執行緒的建立 * 2.執行緒的方法 * * @author liuD * */ public class MultiThread { public stat

Java併發理論

作為IT程式猿,掌握多執行緒是作為伺服器開發人員不可缺少的技能之一,同時在單核CPU的情況下,為了模擬多核的情況,我們也必須掌握多執行緒程式設計的問題,下來我們瞭解一下並行程式設計: 一:前提知識的相關概念 同步、非同步: 同步非同步通常形容方法呼叫, 同步:在方法呼

Java併發及測試程式碼

公司的妹子不會做併發測試。作為一名程式猿看著有點幹捉急。併發測試是多個人同時訪問一個服務,這不就是多執行緒嗎!於是靈光一現使用多執行緒來寫併發測試程式碼。想想心理都有點小激動咧。效果比工具還好,廢話不多說貼程式碼 新增Maven依賴 <!--新增OKHttp.jar包

java併發系列 - 第17天:JUC中的迴圈柵欄CyclicBarrier常見的6種使用場景及程式碼示例

這是java高併發系列第17篇。 本文主要內容: 介紹CyclicBarrier 6個示例介紹CyclicBarrier的使用 對比CyclicBarrier和CountDownLatch CyclicBarrier簡介 CyclicBarrier通常稱為迴圈屏障。它和CountDownLatch很相似,

跟著阿里p7一起學java併發 - 第18天:玩轉java執行緒池,這一就夠了

java中的執行緒池,這一篇就夠了 java高併發系列第18篇文章。 本文主要內容 什麼是執行緒池 執行緒池實現原理 執行緒池中常見的各種佇列 自定義執行緒建立的工廠 常見的飽和策略 自定義飽和策略 執行緒池中兩種關閉方法有何不同 擴充套件執行緒池 合理地配置執行緒池 執行緒池中執行緒數量的配置 什麼是執

java併發系列 - 第23天:JUC中原子類,一就夠了

這是java高併發系列第23篇文章,環境:jdk1.8。 本文主要內容 JUC中的原子類介紹 介紹基本型別原子類 介紹陣列型別原子類 介紹引用型別原子類 介紹物件屬性修改相關原子類 預備知識 JUC中的原子類都是都是依靠volatile、CAS、Unsafe類配合來實現的,需要了解的請移步: volati

java併發系列 - 第27天:實戰,介面效能成倍提升,讓同事刮目相看,現學現用

這是java高併發系列第27篇文章。 開發環境:jdk1.8。 案例講解 電商app都有用過吧,商品詳情頁,需要給他們提供一個介面獲取商品相關資訊: 商品基本資訊(名稱、價格、庫存、會員價格等) 商品圖片列表 商品描述資訊(描述資訊一般是由富文字編輯的大文字資訊) 資料庫中我們用了3張表儲存上面的資訊:

實戰Java併發程式設計.epub

    【下載地址】 在過去單核CPU時代,單任務在一個時間點只能執行單一程式,隨著多核CPU的發展,並行程式開發就顯得尤為重要。 《實戰Java高併發程式設計》主要介紹基於Java的並行程式設計基礎、思路、方法和實戰。第一,立足於併發程式基礎,詳細介紹Ja

Java 併發專案筆記

maven 配置與安裝 下載maven 檔案 解壓之後,將檔案移動到\Applications資料夾內 使用cd ~ 進入根目錄資料夾 用ls -a列出資料夾內的所有檔案,找到一個名稱為.bash_profile的檔案,開啟該檔案來配置環境變數 export JAVA_HOME=/Library/Jav

SpringBoot實現Java併發秒殺系統之併發優化

秒殺系統架構的設計和優化分析,以我一個小菜雞,目前是說不出來的o(╥﹏╥)o。 因此呢,我這裡僅從本專案已經實現的優化來介紹一下: 本專案中做到了以下優化: 秒殺介面採用md5加密方式防刷。 訂單表使用聯合主鍵方式,限制一個使用者只能購買該商品一次。 配合Spring事務

2018最新實戰Java併發程式設計

在過去單核CPU時代,單任務在一個時間點只能執行單一程式,隨著多核CPU的發展,並行程式開發就顯得尤為重要。《實戰Java高併發程式設計》主要介紹基於Java的並行程式設計基礎、思路、方法和實戰。第一,立足於併發程式基礎,詳細介紹Java中進行並行程式設計的基本方法。第二,進一步詳細介紹JDK中對並

高階java併發,高效能,分散式,可用,負載均衡,系統架構實戰

Java併發程式設計(一): 併發程式設計的挑戰本文主要內容出自《Java併發程式設計的藝術》一書,是對該書內容的歸納和理解,有興趣的朋友請購買正版閱讀全部內容。 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行

JAVA併發多執行緒必須懂的50個問題

ImportNew  首頁所有文章資訊Web架構基礎技術書籍教程Java小組工具資源  Java執行緒面試題 Top 50  2014/08/21 | 分類: 基礎技術 | 27 條評論 | 標籤: 多執行緒, 面試題  分享到: 692  本文由

Java併發程式設計之synchronized關鍵字(二)

上一篇文章講了synchronized的部分關鍵要點,詳見:Java高併發程式設計之synchronized關鍵字(一) 本篇文章接著講synchronized的其他關鍵點。 在使用synchronized關鍵字的時候,不要以字串常量作為鎖定物件。看下面的例子: public class

Java併發程式設計之synchronized關鍵字(一)

首先看一段簡單的程式碼: public class T001 { private int count = 0; private Object o = new Object(); public void m() { //任何執行緒要執行下面這段程式碼

實戰Java併發程式設計(五、並行模式與演算法)

5.1單例模式 單例模式:是一種常用的軟體設計模式,在它的核心結構中值包含一個被稱為單例的特殊類。一個類只有一個例項,即一個類只有一個物件例項。  對於系統中的某些類來說,只有一個例項很重要,例如,一個系統中可以存在多個列印任務,但是隻能有一個正在工作的任務;售票時,一共有100張票,可有有

實戰Java併發程式設計(四、鎖的優化及注意事項)

在多核時代,使用多執行緒可以明顯地提升系統的效能。但事實上,使用多執行緒會額外增加系統的開銷。對於單任務或單執行緒的應用來說,其主要資源消耗在任務本身。對於多執行緒來說,系統除了處理功能需求外,還需要維護多執行緒環境特有的資訊,如執行緒本身的元資料,執行緒的排程,執行緒上下文的切換等。 4.1有

實戰Java併發程式設計(3.2 執行緒池)

1.Executor jdk提供了一套Executor框架,本質上是一個執行緒池。 newFixedThreadPool()方法:該方法返回一個固定數量的執行緒池。該執行緒池中的執行緒數量始終不變,當有一個新任務提交時,執行緒池中若有空閒執行緒,則立即執行,若沒有,則任務會暫存在一個任

實戰Java併發程式設計(3.1同步控制)

3.1重入鎖 重入鎖使用java.util.concurrent.locks.ReentrantLock來實現 public class Test implements Runnable { public static ReentrantLock lock = new Reentr

Java併發程式設計——多執行緒

執行緒簡介 程序 正在執行的程式。 程序是系統進行資源分配和呼叫的獨立單位。每一個程序都有他自己的記憶體空間和系統資源。 執行緒 在同一個程序內又可以執行多個任務。而這每一個任務就可以看成是一個執行緒。