1. 程式人生 > >多執行緒--sleep、yield對比

多執行緒--sleep、yield對比

這篇小編想分享一下關於我們常見的sleep、yield方法的有什麼不同。 1、sleep:執行緒睡眠,如果我們需要讓當前正在執行的執行緒暫停一段時間,並進入阻塞狀態,就可以通過呼叫sleep方法來實現。線上程進入阻塞狀態後,再sleep 這段時間內,該執行緒不會獲得執行的機會,及時系統中沒有執行的執行緒,處於sleep中的執行緒也不會執行。 主要由兩種過載方法: (1)static void sleep(long millis):讓當前執行緒暫停millis毫秒並進入阻塞狀態。(ps 常用) (2)static void sleep(long millis,int nanos):讓當前正在執行的執行緒暫停millis毫秒加nanos毫微秒。(ps 不常用)
demo:
public class TestSleep {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for(int i=0;i<10;i++){
            System.out.println("當前時間:"+new Date()+"  "+Thread.currentThread().getName()+"   "+i);
            
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}


2.yield執行緒讓步,是一個Thread類提供的靜態方法,可以讓當前正在執行的執行緒暫停,但他不會阻塞該執行緒,它只是讓該執行緒轉入就緒狀態,當系統的執行緒排程器重新排程時,還可以被排程出來重新執行。此外,當某個執行緒呼叫yield方法暫停時,只有優先順序與當前執行緒相同,或者優先順序更高的執行緒才能獲得執行的機會。 執行緒在排程的過程中需要考慮優先順序,其次是誰得到資源誰執行。 demo:
public class YieldTest extends Thread {
    public YieldTest(){
        
    }
    public YieldTest(String name){
        super(name);
    }
    public void run(){
        for(int i=0;i<50;i++){
            System.out.println(getName()+" "+i);
            //System.out.println(Thread.currentThread().getName()+" "+i);
            if(i == 20){
                Thread.yield();
            }
        }
        
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        YieldTest ty1= new YieldTest("高階");
        ty1.setPriority(Thread.MAX_PRIORITY);
        ty1.start();
        
        YieldTest ty2 =new YieldTest("低階");
        ty2.setPriority(MIN_PRIORITY);
        ty2.start();
        
        /*for(int i=0;i<10;i++){
            YieldTest ty2 =new YieldTest("低階");
            ty2.setPriority(MIN_PRIORITY);
            ty2.start();
            System.out.println(Thread.currentThread().getName()+" "+i);
        }*/
        
    }
} 


解析:大家可以按照提供的demo 執行以下,建議多執行幾遍,有時候可能每次執行的結果都不一樣。其次建議大家把註釋的程式碼也執行以下,有利於大家理解執行緒排程,主執行緒和子執行緒。需要注意的是main主執行緒,這個需要大家好好理解以下。

總結:
         多執行緒我們開始理解的時候可能很簡單,動手做的時候可能感覺很模糊,不清楚執行緒是個怎樣的概念,這個時候需要多執行兩遍你的程式碼,然後修改你的程式碼,繼續執行,你會返現一些不一樣的東西。總之執行緒是個很有意思的東西,大家可以深入研究一下!我在這兒算是拋磚引玉吧!

相關推薦

執行--sleepyield對比

這篇小編想分享一下關於我們常見的sleep、yield方法的有什麼不同。 1、sleep:執行緒睡眠,如果我們需要讓當前正在執行的執行緒暫停一段時間,並進入阻塞狀態,就可以通過呼叫sleep方法來實現。線上程進入阻塞狀態後,再sleep 這段時間內,該執行緒不會獲得執行的機

python執行————8執行程序對比

#多程序程式設計 #耗cpu的操作,用多程序程式設計,對於io操作來說,使用多執行緒程式設計,程序切換代價要高於執行緒 import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor,as_compl

執行——join()sleep()

Thread類的方法中有一個join()方法,它是普通的例項方法,根據Java api,該方法有如下三種形式: void join(): Waits for this thread to die. void join(long millis): Waits

Java執行synchronizedReentrantLockReentrantReadWriteLock 和StampedLock 的對比

synchronized是在JVM層面上實現的,可以通過一些監控工具控制synchronized的鎖定,當代碼出現異常時,JVM會自動釋放鎖定。當只有少量競爭者的時候,synchronized是一個很

Java執行suspendsleep的控制鎖的釋放的區別

         因為馬上畢業了,最近一直在複習Java的基礎知識,多執行緒當然是重點了,今天上午一直在看執行緒的生命階段,其中有過時的方法suspend用來掛起一個執行緒。而關於該方法為何被拋棄了,看了開發文件中是這麼描述的:【方法已經遭到反對,因為它具有固有的死鎖傾向。

python執行————7ThreadPoolExecutor執行

所用到的模組:from concurrent.futures import ThreadPoolExecutor,as_completed,wait,FIRST_COMPLETED 1、建立執行緒池:executor = ThreadPoolExecutor(max_workers= ) 2

python執行————6執行同步之Semaphore

控制程式碼進入執行緒的數量,控制併發數量,可以使用訊號量Semaphore。 1、定義訊號量sem  =  threading.Semaphore(3)  #3為併發數量 2、消耗訊號量 sem.acquire() 3、釋放訊號量 sem.release()

pyhon執行——5執行同步之condition

如何使用多執行緒實現一問一答呢?可以使用condition中的notify和wait方法實現,看程式碼 import threading import time class XiaoAi(threading.Thread): def __init__(self,cond):

python執行————4執行同步之Lock,RLock

     在多執行緒同時請求同一個資源並進行修改時可能會造成結果出錯,例如共享變數       from dis import dis import threading a = 0 def add(): global a

python執行————3執行間通訊:共享變數,queue

1、共享變數 #通過共享變數 import time import threading url_list = [] def get_detail_html(): global url_list while True: if len(url_list):

python執行———2建立執行的兩種方式

 法一、使用Thread類例項化 法二、繼承Thread來實現多執行緒 #對於io操作來說,多執行緒和多程序效能差別不大 #1、使用Thread類例項化 import time import threading def get_detail_html(url): prin

python執行——1GIL

一、GIL是什麼?        執行緒全域性鎖(Global Interpreter lock),python保護執行緒安全而採取的獨立執行緒執行的限制。      1、明確一點GIL並不是python的特性,pytho

iOS 執行 NSOperationNSOperationQueue

1. NSOperation、NSOperationQueue 簡介 NSOperation、NSOperationQueue 是蘋果提供給我們的一套多執行緒解決方案。實際上 NSOperation、NSOperationQueue 是基於 GCD 更高一層的封裝,完全面向物件。但是比 G

java執行-Thread的yield方法

yield表示當前執行緒申請交出執行權,但並不是一定會交出,依賴於系統的執行緒排程。 因此該方法並不穩定。 class Test { public static void main(String[] args) throws InterruptedException { Te

Android 執行-----HandlerThreadHandlerThread的區別和使用

一、他們的區別       ①Handler:在android中負責傳送和處理訊息,通過它可以實現其他支線執行緒與主執行緒之間的訊息通訊。       ②Thread:Java程序中執行運算的最小單位,亦即執行處理機排程的基本單位

python用map()函式和執行threadingThread採集注意事項

import re import requests from threading import Thread def getUrl(): url = 'http://www.xiaohuar

java執行FutureFutureTask使用示例,返回非同步的結果

1、Future、FutureTask介紹 Future是一個介面,該介面用來返回非同步的結果。 FutureTask是一個類,是Future 的一個實現。 2、主要方法 future.get(); 或者 future.get(10000, Ti

java 執行等待喚醒機制例項

例子: 1、實體類 public class Student {     String name;     int age;     boolean flag = false; // 表示沒有值 } 2、執行緒1 public class SetThread impleme

Python3之執行GIL同步鎖訊號量死鎖與遞迴鎖執行QueueEvent定時器

GIL與互斥鎖再理解 執行緒一要把python程式碼交給直譯器去執行,而此時垃圾回收執行緒和執行緒二也需要將自己的任務交給python直譯器去執行,為了防止各個執行緒之間的資料產生衝突,誰拿到GIL鎖的許可權誰才能執行自己的任務,這就避免了不同任務之間的資

執行sleepyield的區別

import java.util.Date; //執行緒暫停 public class SleepTest { public static void main(String[] args) th