1. 程式人生 > >多執行緒的常用操作方法

多執行緒的常用操作方法

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程式碼時,需要先獲取這個鎖,然後去執行相應的程式碼,