package threadgroup;
我們擁有十多年網(wǎng)頁設(shè)計和網(wǎng)站建設(shè)經(jīng)驗,從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設(shè)計師為您提供的解決方案。為企業(yè)提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、微信開發(fā)、微信小程序、手機(jī)網(wǎng)站制作、成都h5網(wǎng)站建設(shè)、等業(yè)務(wù)。無論您有什么樣的網(wǎng)站設(shè)計或者設(shè)計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計服務(wù)并滿足您的需求。
class ThreadDemo3 extends Thread {
private String name;
private int delay;
public ThreadDemo3(String sname, int i_delay) {
name = sname;
delay = i_delay;
}
public void run() {
try {
sleep(delay);
} catch (InterruptedException e) {
}
System.out.println("多線程測試!\n" + name + "\n" + delay);
}
}
public class testMyThread {
public static void main(String[] args) {
ThreadDemo3 th1,th2,th3;
th1 = new ThreadDemo3("線程1", (int) (Math.random() * 900));
th2 = new ThreadDemo3("線程2", (int) (Math.random() * 900));
th3 = new ThreadDemo3("線程3", (int) (Math.random() * 900));
th1.start();
th2.start();
th3.start();
}
}
package threadgroup;
public class threadDemo {
public static void main(String[] args) {
Thread t = Thread.currentThread();
t.setName("你好嗎?");
System.out.println("正在進(jìn)行的Thread是:" + t);
try {
for (int i = 0; i 5; i++) {
System.out.println("我不叫穆繼超" + i);
Thread.sleep(3000);
}
} catch (Exception e) {
// TODO: handle exception
System.out.println("Thread has wrong" + e.getMessage());
}
}
}
package threadgroup;
public class threadDemo2 implements Runnable {
public threadDemo2() {
Thread t1 = Thread.currentThread();
t1.setName("第一個主進(jìn)程");
System.out.println("正在運行" + t1);
Thread t2 = new Thread(this, "");
System.out.println("在創(chuàng)建一個進(jìn)程");
t2.start();
try {
System.out.println("使他進(jìn)入第一個睡眠狀態(tài)");
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("Thread has wrong" + e.getMessage());
}
System.out.println("退出第一個進(jìn)程");
}
public void run() {
try {
for (int i = 0; i 5; i++) {
System.out.println("進(jìn)程" + i);
Thread.sleep(3000);
}
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println("Thread has wrong" + e.getMessage());
}
System.out.println("退出第二個進(jìn)程");
}
public static void main(String[] args) {
new threadDemo2();
}
}
package test;
public class Test33{
private static int state = 1;
private static int num1 = 1;
private static int num2 = 2;
public static void main(String[] args) {
final Test33 t = new Test33();
new Thread(new Runnable() {
@Override
public void run() {
while(num1100){
//兩個線程都用t對象作為鎖,保證每個交替期間只有一個線程在打印
synchronized (t) {
// 如果state!=1, 說明此時尚未輪到線程1打印, 線程1將調(diào)用t的wait()方法, 直到下次被喚醒
if(state!=1){
try {
t.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 當(dāng)state=1時, 輪到線程1打印5次數(shù)字
for(int j=0; j1; j++){
System.out.println(num1);
num1 += 2;
}
// 線程1打印完成后, 將state賦值為2, 表示接下來將輪到線程2打印
state = 2;
// notifyAll()方法喚醒在t上wait的線程2, 同時線程1將退出同步代碼塊, 釋放t鎖
t.notifyAll();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(num2100){
synchronized (t) {
if(state!=2){
try {
t.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0; j1; j++){
System.out.println(num2);
num2 += 2;
}
state = 1;
t.notifyAll();
}
}
}
}).start();
}
}
回答這個問題需要先弄清楚線程的概念和線程的生命周期。
線程:是指程序代碼的一次執(zhí)行,是動態(tài)的過程。樓主在定義OneTh這個實現(xiàn)Runnable接口類的時候肯定復(fù)寫了他的run()方法。onet1和onet2是兩個線程,也就是說雖然他們的run()方法相同,但是是執(zhí)行了兩次的。
計算機(jī)中CPU的調(diào)度過程:現(xiàn)在的電腦看上去能同時實現(xiàn)多任務(wù),像是一邊上QQ,一邊聽音樂,還可以一邊上網(wǎng)。但計算機(jī)中的CPU只有一個,它沒有分身術(shù),不可能真正意義上實現(xiàn)同時運行這么多程序。而是采用了一種時間片輪轉(zhuǎn)的方式,為每個應(yīng)用程序賦予極短的時間,然后高速的在不同的程序間切換,至于每次切換到那個程序,這個要由CPU和線程的優(yōu)先級來決定。
線程的生命周期:創(chuàng)建時是初始化了這個線程,調(diào)用start方法時,是讓這個線程進(jìn)入了可運行狀態(tài),注意是可運行,不是正在運行。就像上面說的,在某一時刻CPU具體要運行誰是由CPU和線程的優(yōu)先級決定的。當(dāng)線程被CPU運行時,就會開始執(zhí)行run方法,但可能執(zhí)行到一半時,CPU又被其他可運行線程搶走,而只能暫停執(zhí)行。
JAVA程序線程的運行:在我們使用java命令來運行程序時,這時候已經(jīng)開始了兩個線程,一個是main()方法的線程,一個是垃圾回收的線程。當(dāng)樓主調(diào)用start方法開啟另外兩個線程時。這時候由于CPU來決定運行哪個線程。所以雖然noet1是先開啟的,但在執(zhí)行noet1時,CPU可能又去跑去執(zhí)行main線程了,然后就會開啟onet2.
還有我覺得主線程結(jié)束了,只不過其他兩個線程仍在繼續(xù)運行。所以會打印出結(jié)果。
樓主如果還有什么不明白的話可以繼續(xù)問或者相互討論。
這邊我寫了一個例子,兩個線程同時獲取隨機(jī)數(shù),當(dāng)獲取的值為68的時候則停止所有進(jìn)程。
這是目錄結(jié)構(gòu):MyThreadOne和MyThreadTwo是兩個線程,TestMain是主函數(shù),MyThread繼承Thread類。
MyThread.java
package?com.xsx.test;
public?class?MyThread?extends?Thread?{
public?void?stopThread()?{}
}
MyThreadOne.java
package?com.xsx.test;
import?java.util.Random;
public?class?MyThreadOne?extends?MyThread{
private?boolean?isOK?=?true;
Random?random?=?new?Random();//演示
public?void?stopThread()?{
this.isOK?=?false;
}
@Override
public?void?run()?{
while(isOK)?{
int?x?=?random.nextInt(10000);
System.out.println("Thread?One:?"?+?x);
if(x?==?68)?{
TestMain.stopAll();
System.out.println("My?Value?is?"?+?x);
break;
}
}
//這邊你結(jié)合自己的邏輯來寫,總之,是通過isOK來控制線程的
}
}
MyThreadTwo.java
package?com.xsx.test;
import?java.util.Random;
public?class?MyThreadTwo?extends?MyThread?{
private?boolean?isOK?=?true;
Random?random?=?new?Random();//演示
public?void?stopThread()?{
this.isOK?=?false;
}
@Override
public?void?run()?{
while(isOK)?{
int?x?=?random.nextInt(10000);
System.out.println("Thread?Two:?"?+?x);
if(x?==?68)?{
TestMain.stopAll();
System.out.println("My?Value?is?"?+?x);
break;
}
}
}
}
TestMain.java
package?com.xsx.test;
import?java.util.HashMap;
import?java.util.Iterator;
import?java.util.Map;
public?class?TestMain?{
public?static?MapString,?MyThread?threadPool?=?new?HashMapString,?MyThread();//定義一個線程池
/***
?*?終止所有線程
?*/
public?static?void?stopAll()?{
IteratorMyThread?threads?=?threadPool.values().iterator();
while(threads.hasNext())?{
threads.next().stopThread();
}
threadPool.clear();
}
public?static?void?main(String[]?args)?{
//實例化兩個線程獲取到隨機(jī)數(shù)為68時就停止進(jìn)程,并輸出
MyThread?thread1?=?new?MyThreadOne();//實例化線程1
MyThread?thread2?=?new?MyThreadTwo();//實例化線程2
threadPool.put("thread1",?thread1);//將線程1放入線程池中
threadPool.put("thread2",?thread2);//將線程2放入線程池中
thread1.start();//運行
thread2.start();
}
}
項目已經(jīng)打包上傳