多執行緒的常用操作方法
1.執行緒命名與取得
Ⅰ.通過構造方法將執行緒命名
- public Thread(String name)
- public Thread(Runnable target , String name)
Ⅱ.設定執行緒名稱
- public final synchronized void setName(String name)
Ⅲ.獲得執行緒名稱
- public final String getName( )
Ⅳ.取得當前正在執行的執行緒物件
- public static native Thread currentThread( )
class Mythread implements Runnable {
@Override
public void run() {
for(int i=0;i<10;i++) {
System.out.println("當前執行緒:"+Thread.currentThread().getName()+",i="+i);
}
}
}
public class Test {
public static void main(String[] args) {
Mythread mythread = new Mythread();
//沒有設定名字
new Thread(mythread).start();
new Thread (mythread).start();
//設定名字
new Thread(mythread,"執行緒3").start();
}
}
如果沒有設定執行緒名字,則會自動分配一個執行緒名字,以-0開始。
2.執行緒休眠(sleep( )方法)----單位(ms)
概念:讓執行緒暫緩執行一下,等到了預計時間之後再恢復執行。執行緒休眠會立即交出CPU,讓CPU去執行其他任務;執行緒休眠不會釋放物件鎖。
class Mythread implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("當前執行緒:"+Thread.currentThread().getName()+",i="+i);
}
}
}
public class Test {
public static void main(String[] args) {
Mythread mythread = new Mythread();
new Thread(mythread).start();
new Thread(mythread).start();
new Thread(mythread).start();
}
}
3.執行緒讓步(yield( )方法)
概念:暫停當前正在執行的執行緒物件,並執行其他執行緒。yield( )會讓當前執行緒交出CPU,但不一定立即交出。yield( )交出CPU後只能讓擁有相同優先順序的執行緒有獲取CPU的機會。yield( )不會釋放物件鎖。
class Mythread implements Runnable{
@Override
public void run() {
for(int i=0;i<3;i++) {
Thread.yield();
System.out.println("當前執行緒:"+Thread.currentThread().getName()+",i="+i);
}
}
}
public class Test {
public static void main(String[] args) {
Mythread mythread = new Mythread();
new Thread(mythread).start();
new Thread(mythread).start();
new Thread(mythread).start();
}
}
4.join( )方法
概念:作用是讓呼叫該方法的執行緒在執行完run( )方法之後,再執行join方法之後的程式碼。簡而言之,就是將兩個執行緒合併,用於實現同步功能。具體而言,可以通過執行緒A的join( )方法來等待執行緒A的結束,或者使用執行緒A的join(2000)方法來等待執行緒A的結束,但最多隻等待2s。join( )方法只是對Object類的wait( )方法做了一層包裝而已。
class MyThread implements Runnable{
@Override
public void run() {
try {
System.out.println("Begin ThreadImpl");
Thread.sleep(5000);
System.out.println("End ThreadImpl");
} catch (InterruptedException e) {
// TODO: handle exception
}
}
}
public class JoinTest {
public static void main(String[] args) {
Thread t = new Thread(new MyThread());
t.start();
try {
t.join(1000);//主執行緒等待t秒結束,只等1秒
if(t.isAlive()) {//t已經結束
System.out.println("t has not finished");
}else {
System.out.println("t has finished");
}
System.out.println("joinFinish");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//Begin ThreadImpl
//t has not finished
//joinFinish
//End ThreadImpl
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
class Mythread implements Runnable{
@Override
public void run() {
try {
System.out.println("主執行緒睡眠前的時間");
Test.printTime();
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName());
System.out.println("睡眠結束時間");
Test.printTime();
} catch (Exception e) {
// TODO: handle exception
}
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
Mythread mythread = new Mythread();
Thread thread = new Thread(mythread,"子執行緒A");
thread.start();
System.out.println(Thread.currentThread().getName());
thread.join();
System.out.println("程式碼結束");
}
public static void printTime() {
Date date=new Date();
DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=format.format(date);
System.out.println(time);
}
}
//main
//主執行緒睡眠前的時間
//2018-11-15 10:56:11
//子執行緒A
//睡眠結束時間
//2018-11-15 10:56:13
//程式碼結束
5.執行緒停止
Ⅰ.手工設定標記位,讓執行緒在滿足條件後退出。【推薦】
class MyThread implements Runnable{
private boolean flag = true;
@Override
public void run() {
int i=1;
while(flag) {
try {
Thread.sleep(1000);
System.out.println("第"+i+"次執行,執行緒名稱為:"+Thread.currentThread().getName());
i++;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread1 = new Thread(myThread,"子執行緒A");
thread1.start();
Thread.sleep(2000);
myThread.setFlag(false);
System.out.println("程式碼結束");
}
}
//第1次執行,執行緒名稱為:子執行緒A
//程式碼結束
//第2次執行,執行緒名稱為:子執行緒A
Ⅱ.使用stop( )方法強制讓執行緒退出,但是該方法不安全,已經被廢棄了
class MyThread implements Runnable{
@Override
public void run() {
int i=1;
while(true) {
try {
Thread.sleep(1000);
System.out.println("第"+i+"次執行,執行緒名稱為:"+Thread.currentThread().getName());
i++;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread1 = new Thread(myThread,"子執行緒A");
thread1.start();
Thread.sleep(3000);
thread1.stop();
System.out.println("程式碼結束");
}
}
//第1次執行,執行緒名稱為:子執行緒A
//第2次執行,執行緒名稱為:子執行緒A
//程式碼結束
對執行緒不安全的解釋:
因為stop會解除由執行緒獲取的所有鎖定,當在一個執行緒物件上呼叫stop( )方法時,這個執行緒物件所執行的執行緒就會立即停止,假如一個執行緒正在執行:synchronized void {x=3; y=4;}由於方法是同步的,多個執行緒訪問時總能保證x,y被同時賦值,而如果一個執行緒正在執行到x=3;時被呼叫了stop( )方法,即使在同步塊中,它也會立即停止,這樣就產生了不完整的殘廢資料。
Ⅲ.使用Thread類提供的interrupt( )中斷執行緒
在Ⅰ中,通過自己設定flag雖然能夠終止執行緒,但同樣也存在問題:當執行緒處於非執行狀態時(當sleep( )方法被呼叫或當wait( )方法被呼叫或當被I/O阻塞時),這種方法就不可用了。此時可以使用interrupt( )方法來打破阻塞的情況,當interrupt( )方法被呼叫時,會丟擲InterrruptedException異常,可以通過在run( )方法中捕獲這個異常來讓執行緒安全退出。
public class MyThread {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread go to sleep");
try {
//用休眠來模擬執行緒被阻塞
Thread.sleep(5000);
System.out.println("thread finish");
} catch (InterruptedException e) {
System.out.println("thread is interrupted");
}
}
});
thread.start();
thread.interrupt();
}
}
//thread go to sleep
//thread is interrupted
interrupt( )方法只是將執行緒的狀態改為中斷狀態而已,它不會中斷一個正在執行的執行緒。本質是系統設定的標記位。
如果執行緒因為I/O而停滯,進入非執行狀態,基本上要等到I/O完成才能離開這個狀態,在這種情況下,無法使用interrupt( )方法來使程式離開run( )方法。這就需要使用一個替代的方法,基本思路也是觸發一個異常,而這個異常與所使用的I/O相關,例如,如果使用readLine( )方法在等待網路上的一個資訊,此時執行緒處於阻塞狀態。讓程式離開run( )方法就是使用close( )方法來關閉流,在這種情況下會引發IOException異常,run( )方法可以通過捕獲這個異常來安全地結束執行緒。
6.執行緒優先順序
概念:優先順序越高越有可能先執行而已。
- 設定優先順序:public final void setPriority(int newPriority)
- 取得優先順序:public final int getPriority( )
Thread.MAX_PRIORITY=10;
Thread.NORM_PRIORITY=5;
Thread.MIN_PRIORITY=1;
優先順序可以繼承。在A執行緒中啟動B執行緒,則A和B的優先順序一樣。
相關推薦
多執行緒常用操作方法(sleep、yield、join)
執行緒的命名與取得 執行緒的命名: 通過構造方法在建立執行緒時設定執行緒名稱 直接繼承Thread類: public Thread (String name); Runable或者Callable介面實現多執行緒: public Thread (Run
多執行緒——常用操作方法(二)
多執行緒常用操作可以總結成一下七種。 1、取得當前執行緒物件: public static native Thread currentThread(); 2、執行緒的命名和取得當前執行緒的名字:public Thread(Runnable terget,String n
Java 多執行緒常用操作方法
1.多執行緒常用方法: currentThread() : 獲取當前執行的執行緒 getName() : 獲取執行緒名稱 setName() : 設定執行緒名稱 sleep(long millis) : 是一個靜態方法,使當前執行執行緒進入睡眠狀態
【java多執行緒】執行緒常用操作方法總結
文章目錄 執行緒的命名與獲取 執行緒休眠 執行緒中斷 執行緒強制執行 執行緒禮讓 執行緒優先順序 多執行緒的主要操作方法都在Thread類中定義了。 執行緒的
執行緒常用操作方法
執行緒常用操作方法 取得和設定執行緒的名稱 1.在Threadl類中,可以通過getName()方法取得執行緒的名稱,通過setName()方法設定執行緒的名稱 2.執行緒的名稱一般在啟動執行緒前設定,但也允許為已經執行的執行緒設定名稱。允許兩個Thread物件有相同的名字,但為了清晰
菜雞的Java筆記 - java 執行緒常用操作方法
執行緒常用操作方法 執行緒的命名操作,執行緒的休眠,執行緒的優先順序 執行緒的所有操作方法幾乎都在 Thread 類中定義好
多執行緒常用的幾個方法彙總
最近學習併發程式設計遇到不少問題,就順手總結了有關多執行緒的幾個常用的方法sleep()sleep()方法屬於Thread類,主要的作用是讓當前執行緒停止執行,把cpu讓給其他執行緒執行,但不會釋放物件鎖和監控的狀態,到了指定時間後執行緒又會自動恢復執行狀態注意:執行緒睡眠到期自動甦醒,並返回到可執行狀態,不
整理 C# 多執行緒常用的幾個物件和方法
Thread 幾個中要的方法 Sleep(int):靜態方法,暫停當前執行緒指定的毫秒數 Abort():通常使用該方法來終止一個執行緒 ,Thread.ResetAbort() 可以恢復終止的執行緒 Suspend():不是終止未完成的執行緒,它僅
多執行緒常用方法統計
currentThread(): currentThread()方法可返回程式碼段正在被那個執行緒呼叫的資訊。 isAlive(): 方法isAlive()的功能是判斷當前的執行緒是否處於活動狀態。 sleep(): 在指定的毫秒數內讓當前“正在執行的執行緒”休眠(暫停執
面試題 多執行緒 順序操作
問題 編寫一個程式,程式會啟動4個執行緒,向4個檔案A,B,C,D裡寫入資料,每個執行緒只能寫一個值。 執行緒A:只寫1 執行緒B:只寫2 執行緒C:只寫3 執行緒D:只寫4 4個檔案A,B,C,D。 程式執行起來,4個檔案的寫入結果如下:
多執行緒之join方法
一.前言: 在很多情況下,我們都是通過主執行緒建立並啟動子執行緒的,如果子執行緒中需要耗費大量的時間計算的話,主執行緒往往會比子執行緒先結束,這個時候就會導致有時候主執行緒想獲取子執行緒計算之後的結果,但是卻獲取不到。這個時候,我們就可以通過
Java多執行緒之join()方法
概要 本章,會對Thread中join()方法進行介紹。涉及到的內容包括: 1. join()介紹 2. join()原始碼分析(基於JDK1.7.0_40) 3. join()示例 來源:http://www.cnblogs.com/skywang12345/p/34792
白話理解java多執行緒之join()方法
join字面意思是加入,我理解為插隊. 舉例:媽媽在炒菜,發現沒喲醬油了,讓兒子去打醬油,兒子打完醬油,媽媽炒完菜,全家一起吃 package cn.yh.thread01; /** * * 打醬油的例子 */ public class Demo03 { public stat
Android開發之多執行緒的操作方式Thread,TimerTask,AsyncTask
雨鬆MOMO原創文章如轉載,請註明:轉載至我的獨立域名部落格雨鬆MOMO程式研究院,原文地址:http://www.xuanyusong.com/archives/344 Android研究院之遊戲開發多執行緒(十六) 遊戲開發與軟體開發多執行緒的重要性 &
WPF下多執行緒的使用方法
一、WPF的執行緒 對於初學wpf的人來說,一般會把所有的程式都在一個執行緒中執行,當資料量較大,需要頻繁重新整理介面時,介面會出現卡頓的情況。 1、當我們開啟一個WPF應用程式即開啟了一個程序,該程序中都會載入兩個重要的執行緒:一個用於呈現使用者介面,另一個用於管理使用者介面。
OpenMP: 多執行緒檔案操作
OpenMP:多執行緒檔案操作 簡介 具體實現 1. OpenMP常用函式 2. 並行區域 3. for 迴圈並行化基本用法 3.1 資料不相關性 3.2 for迴圈並行化的幾
多執行緒非同步操作日誌
上次寫的一篇部落格,多執行緒非同步操作日誌不完整,現在寫一個完整的 功能是:使用者訪問一個controller,將訪問的記錄儲存到佇列中去,在開啟定時器,消費掉記錄儲存到檔案中(可改為儲存到資料庫) 我的idea目錄: controller中的程式碼: package com.
多執行緒常用面試題
一 面試中關於 synchronized 關鍵字的 5 連擊 1.1 說一說自己對於 synchronized 關鍵字的瞭解 synchronized關鍵字解決的是多個執行緒之間訪問資源的同步性,synchronized關鍵字可以保證被它修飾的方法或者程式碼塊在任意時刻只能有
C語言多執行緒目錄操作
#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <sys/types.h>#include <dirent.h> #define NUM 2 void threa
多執行緒的實現方法
Java提供了三種實現同步機制的方法: (1)synchronized 關鍵字 Java語言中,每個物件都有一個物件鎖與之關聯,該鎖表明物件在任何時候只允許被一個執行緒所擁有,當一個執行緒呼叫一段synchronized程式碼時,需要先獲取這個鎖,然後去執行相應的程式碼,