欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java進(jìn)程等待代碼 Java 進(jìn)程

在JAVA循環(huán)中,怎么讓程序停頓1秒?

可以參考下面的代碼:

嶗山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

public class Test{

public static void main(String args[]){

int[]a=new int[20];

for(int i=1;i=20;i++){

a[i-1]=i;

try{Thread.sleep(1000);}catch(Exception e){}

System.out.println(a[i-1]);

}

}

}//利用數(shù)組,輸出20個數(shù),每秒輸出一個。

擴展資料:

Java幾種常用的循環(huán)如下:

1、for循環(huán)(已知循環(huán)多少次)

使用方法:先判斷,在執(zhí)行;如果循環(huán)次數(shù)確定,那么一般用for循環(huán)

2、while循環(huán)

使用方法:先判斷,在執(zhí)行;當(dāng)條件表達(dá)式成立時,則執(zhí)行循環(huán)體,然后再進(jìn)行判斷,如果條件不成立時,有可能不執(zhí)行。一般用于循環(huán)次數(shù)不確定的循環(huán)

3、do..while循環(huán)

使用方法:先執(zhí)行,后判斷;一般用于循環(huán)次數(shù)不確定的循環(huán),與while循環(huán)不同的是先執(zhí)行后判斷,至少會執(zhí)行一次。

參考資料來源:百度百科-Java (計算機編程語言)

java中如何實現(xiàn):主線程等待UI輸入,然后繼續(xù)運行?

在你的代碼基礎(chǔ)上改進(jìn)了。

package com.sacswing.resource;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

public class Test extends JFrame {

//同步變量

private static Boolean continueThread = false;

public Test() {

Container container = getContentPane();

JButton btn = new JButton("主線程繼續(xù)");

//按鈕要添加監(jiān)聽,來控制共享數(shù)據(jù)continueThread

btn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

continueThread = !continueThread;

}

});

container.add(btn);

}

public static void main(String[] args) {

Test frame = new Test();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(100, 100);

frame.setVisible(true);

System.out.println("1");

// 這里時要求的代碼,要求主線程在這里懸停,直到我按下“主線程繼續(xù)”按鈕,然后才輸出“2”

synchronized (continueThread) {

//如果繼續(xù)線程為false,則執(zhí)行循環(huán)

while (continueThread == false) {

}

}

System.out.println("2");

}

}

JAVA進(jìn)程類中,sleep,wait,join,yield有何差別?并說明進(jìn)城有哪幾種狀態(tài)

1.sleep()

使當(dāng)前線程(即調(diào)用該方法的線程)暫停執(zhí)行一段時間,讓其他線程有機會繼續(xù)執(zhí)行,但它并不釋放對象鎖。也就是如果有Synchronized同步塊,其他線程仍然不同訪問共享數(shù)據(jù)。注意該方法要捕獲異常

比如有兩個線程同時執(zhí)行(沒有Synchronized),一個線程優(yōu)先級為MAX_PRIORITY,另一個為MIN_PRIORITY,如果沒有Sleep()方法,只有高優(yōu)先級的線程執(zhí)行完成后,低優(yōu)先級的線程才能執(zhí)行;但當(dāng)高優(yōu)先級的線程sleep(5000)后,低優(yōu)先級就有機會執(zhí)行了。

總之,sleep()可以使低優(yōu)先級的線程得到執(zhí)行的機會,當(dāng)然也可以讓同優(yōu)先級、高優(yōu)先級的線程有執(zhí)行的機會。

2.join()

join()方法使調(diào)用該方法的線程在此之前執(zhí)行完畢,也就是等待調(diào)用該方法的線程執(zhí)行完畢后再往下繼續(xù)執(zhí)行。注意該方法也要捕獲異常。

3.yield()

它與sleep()類似,只是不能由用戶指定暫停多長時間,并且yield()方法只能讓同優(yōu)先級的線程有執(zhí)行的機會。

4.wait()和notify()、notifyAll()

這三個方法用于協(xié)調(diào)多個線程對共享數(shù)據(jù)的存取,所以必須在Synchronized語句塊內(nèi)使用這三個方法。前面說過Synchronized這個關(guān)鍵字用于保護(hù)共享數(shù)據(jù),阻止其他線程對共享數(shù)據(jù)的存取。但是這樣程序的流程就很不靈活了,如何才能在當(dāng)前線程還沒退出Synchronized數(shù)據(jù)塊時讓其他線程也有機會訪問共享數(shù)據(jù)呢?此時就用這三個方法來靈活控制。

wait()方法使當(dāng)前線程暫停執(zhí)行并釋放對象鎖標(biāo)志,讓其他線程可以進(jìn)入Synchronized數(shù)據(jù)塊,當(dāng)前線程被放入對象等待池中。當(dāng)調(diào)用 notify()方法后,將從對象的等待池中移走一個任意的線程并放到鎖標(biāo)志等待池中,只有

鎖標(biāo)志等待池中的線程能夠獲取鎖標(biāo)志;如果鎖標(biāo)志等待池中沒有線程,則notify()不起作用。

notifyAll()則從對象等待池中移走所有等待那個對象的線程并放到鎖標(biāo)志等待池中。

注意 這三個方法都是java.lang.Ojbect的方法!

------------

再添兩天比較熟悉的:

2.run()和start()

這兩個方法應(yīng)該都比較熟悉,把需要并行處理的代碼放在run()方法中,start()方法啟動線程將自動調(diào)用 run()方法,這是由Java的內(nèi)存機制規(guī)定的。并且run()方法必須是public訪問權(quán)限,返回值類型為void。

2.關(guān)鍵字Synchronized

這個關(guān)鍵字用于保護(hù)共享數(shù)據(jù),當(dāng)然前提是要分清哪些數(shù)據(jù)是共享數(shù)據(jù)。每個對象都有一個鎖標(biāo)志,當(dāng)一個線程訪問該對象時,被Synchronized修飾的數(shù)據(jù)將被“上鎖”,阻止其他線程訪問。當(dāng)前線程訪問完這部分?jǐn)?shù)據(jù)后釋放鎖標(biāo)志,其他線程就可以訪問了。

public ThreadTest implements Runnable

{

public synchronized void run(){

for(int i=0;i10;i++)

{

System.out.println(" " + i);

}

}

public static void main(String[] args)

{

Runnable r1 = new ThreadTest();

Runnable r2 = new ThreadTest();

Thread t1 = new Thread(r1);

Thread t2 = new Thread(r2);

t1.start();

t2.start();

}

}

以上這段程序中的 i 變量并不是共享數(shù)據(jù),也就是這里的Synchronized關(guān)鍵字并未起作用。因為t1,t2兩個線程是兩個對象(r1,r2)的線程。不同的對象其數(shù)據(jù)是不同的,所以r1和r2兩個對象的i變量是并不是共享數(shù)據(jù)。

當(dāng)把代碼改成如下:Synchronized關(guān)鍵字才會起作用

Runnable r = new ThreadTest();

Thread t1 = new Thread(r);

Thread t2 = new Thread(r);

t1.start();

t2.start();

---------------

JAVA線程的四種狀態(tài)

線程有四種狀態(tài),任何一個線程肯定處于這四種狀態(tài)中的一種:

1) 產(chǎn)生(New):線程對象已經(jīng)產(chǎn)生,但尚未被啟動,所以無法執(zhí)行。如通過new產(chǎn)生了一個線程對象后沒對它調(diào)用start()函數(shù)之前。

2) 可執(zhí)行(Runnable):每個支持多線程的系統(tǒng)都有一個排程器,排程器會從線程池中選擇一個線程并啟動它。當(dāng)一個線程處于可執(zhí)行狀態(tài)時,表示它可能正處于線程池中等待排排程器啟動它;也可能它已正在執(zhí)行。如執(zhí)行了一個線程對象的start()方法后,線程就處于可執(zhí)行狀態(tài),但顯而易見的是此時線程不一定正在執(zhí)行中。

3) 死亡(Dead):當(dāng)一個線程正常結(jié)束,它便處于死亡狀態(tài)。如一個線程的run()函數(shù)執(zhí)行完畢后線程就進(jìn)入死亡狀態(tài)。

4) 停滯(Blocked):當(dāng)一個線程處于停滯狀態(tài)時,系統(tǒng)排程器就會忽略它,不對它進(jìn)行排程。當(dāng)處于停滯狀態(tài)的線程重新回到可執(zhí)行狀態(tài)時,它有可能重新執(zhí)行。如通過對一個線程調(diào)用wait()函數(shù)后,線程就進(jìn)入停滯狀態(tài),只有當(dāng)兩次對該線程調(diào)用notify或notifyAll后它才能兩次回到可執(zhí)行狀態(tài)。

Java Thread BLOCKED和WAITING兩種狀態(tài)的區(qū)別

一、線程5種狀態(tài)

新建狀態(tài)(New) 新創(chuàng)建了一個線程對象。

就緒狀態(tài)(Runnable) 線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權(quán)。

運行狀態(tài)(Running) 就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。

阻塞狀態(tài)(Blocked) 阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán),暫時停止運行。直到線程進(jìn)入就緒狀態(tài),才有機會轉(zhuǎn)到運行狀態(tài)。阻塞的情況分三種:

等待阻塞:運行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中。

同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。

其他阻塞:運行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。

死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。

二、Jstack中常見的線程狀態(tài)

應(yīng)用程序啟動后,我們對系統(tǒng)運行狀況的觀測大部分情況下是通過運行日志。但是若某一天發(fā)現(xiàn),日志中記錄的行為與預(yù)想的不一致,此時需要進(jìn)一步的系統(tǒng)監(jiān)控該怎么辦,Jstack是常用的排查工具,它能輸出在某一個時間,Java進(jìn)程中所有線程的狀態(tài),很多時候這些狀態(tài)信息能給我們的排查工作帶來有用的線索。?

Jstack的輸出中,Java線程狀態(tài)主要是以下幾種:

RUNNABLE?線程運行中或I/O等待

BLOCKED?線程在等待monitor鎖(synchronized關(guān)鍵字)

TIMED_WAITING?線程在等待喚醒,但設(shè)置了時限

WAITING?線程在無限等待喚醒

1) 讓線程一直處于RUNNABLE

public?static?void?runnable()?{

long?i?=?0;

while?(true)?{

i++;

}

}

2) 讓線程一直處于BLOCKED

public?static?void?blocked()?{

final?Object?lock?=?new?Object();

new?Thread()?{

public?void?run()?{

synchronized?(lock)?{

System.out.println("i?got?lock,?but?don't?release");

try?{

Thread.sleep(1000L?*?1000);

}?catch?(InterruptedException?e)?{

}

}

}

}.start();

try?{?Thread.sleep(100);?}?catch?(InterruptedException?e)?{}

synchronized?(lock)?{

try?{

Thread.sleep(30?*?1000);

}?catch?(InterruptedException?e)?{

}

}

}

主線程sleep,先讓另外一個線程拿到lock,并長期持有l(wèi)ock(sleep會持有鎖,wait不會)。此時主線程會BLOCK住等待lock被釋放,此時jstack的輸出可以看到main線程狀態(tài)是BLOCKED。這里要注意的是只有synchronized這種方式的鎖(monitor鎖)才會讓線程出現(xiàn)BLOCKED狀態(tài),等待ReentrantLock則不會。

3)?讓線程處于TIMED_WAITING狀態(tài)

public?static?void?timedWaiting()?{

final?Object?lock?=?new?Object();

synchronized?(lock)?{

try?{

lock.wait(30?*?1000);

}?catch?(InterruptedException?e)?{

}

}

}

4)讓線程處于WAITING狀態(tài)

public?static?void?waiting()?{

final?Object?lock?=?new?Object();

synchronized?(lock)?{

try?{

lock.wait();

}?catch?(InterruptedException?e)?{

}

}

}

無超時的等待,必須等待lock.notify()或lock.notifyAll()或接收到interrupt信號才能退出等待狀態(tài)。

java中,如何能做到這種效果: 程序運行到特定代碼行的時候,等待用戶觸發(fā)某個事件才繼續(xù)運行。

要使用線程 wait 和喚醒

while(條件)

wait();

while(條件)

//喚醒線程wait(),執(zhí)行wait前的動作

notifyAll();

名稱欄目:java進(jìn)程等待代碼 Java 進(jìn)程
標(biāo)題URL:http://chinadenli.net/article10/dodipgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、品牌網(wǎng)站設(shè)計做網(wǎng)站、商城網(wǎng)站、營銷型網(wǎng)站建設(shè)、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)