午夜无码人妻aⅴ大片色欲张津瑜,国产69久久久欧美黑人A片,色妺妺视频网,久久久久国产综合AV天堂

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

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

可以參考下面的代碼:

嶗山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuā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個(gè)數(shù),每秒輸出一個(gè)。

擴(kuò)展資料:

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

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

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

2、while循環(huán)

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

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

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

參考資料來(lái)源:百度百科-Java (計(jì)算機(jī)編程語(yǔ)言)

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

在你的代碼基礎(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)聽(tīng),來(lái)控制共享數(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");

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

synchronized (continueThread) {

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

while (continueThread == false) {

}

}

System.out.println("2");

}

}

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

1.sleep()

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

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

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

2.join()

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

3.yield()

它與sleep()類(lèi)似,只是不能由用戶(hù)指定暫停多長(zhǎng)時(shí)間,并且yield()方法只能讓同優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì)。

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

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

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

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

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

注意 這三個(gè)方法都是java.lang.Ojbect的方法!

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

再添兩天比較熟悉的:

2.run()和start()

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

2.關(guān)鍵字Synchronized

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

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)鍵字并未起作用。因?yàn)閠1,t2兩個(gè)線程是兩個(gè)對(duì)象(r1,r2)的線程。不同的對(duì)象其數(shù)據(jù)是不同的,所以r1和r2兩個(gè)對(duì)象的i變量是并不是共享數(shù)據(jù)。

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

Runnable r = new ThreadTest();

Thread t1 = new Thread(r);

Thread t2 = new Thread(r);

t1.start();

t2.start();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

同步阻塞:運(yùn)行的線程在獲取對(duì)象的同步鎖時(shí),若該同步鎖被別的線程占用,則JVM會(huì)把該線程放入鎖池中。

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

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

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

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

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

RUNNABLE?線程運(yùn)行中或I/O等待

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

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

WAITING?線程在無(wú)限等待喚醒

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

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)?{

}

}

}

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

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

要使用線程 wait 和喚醒

while(條件)

wait();

while(條件)

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

notifyAll();

名稱(chēng)欄目:java進(jìn)程等待代碼 Java 進(jìn)程
標(biāo)題URL:http://www.ekvhdxd.cn/article10/dodipgo.html

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

廣告

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

小程序開(kāi)發(fā)