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高併發程式設計——多執行緒
執行緒簡介 程序 正在執行的程式。 程序是系統進行資源分配和呼叫的獨立單位。每一個程序都有他自己的記憶體空間和系統資源。 執行緒 在同一個程序內又可以執行多個任務。而這每一個任務就可以看成是一個執行緒。