重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
package threadgroup;
我们拥有十多年网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供成都网站设计、成都网站建设、微信开发、微信小程序、手机网站制作、成都h5网站建设、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。
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("正在进行的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("第一个主进程");
System.out.println("正在运行" + t1);
Thread t2 = new Thread(this, "");
System.out.println("在创建一个进程");
t2.start();
try {
System.out.println("使他进入第一个睡眠状态");
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("Thread has wrong" + e.getMessage());
}
System.out.println("退出第一个进程");
}
public void run() {
try {
for (int i = 0; i 5; i++) {
System.out.println("进程" + i);
Thread.sleep(3000);
}
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println("Thread has wrong" + e.getMessage());
}
System.out.println("退出第二个进程");
}
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将调用t的wait()方法, 直到下次被唤醒
if(state!=1){
try {
t.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 当state=1时, 轮到线程1打印5次数字
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();
}
}
回答这个问题需要先弄清楚线程的概念和线程的生命周期。
线程:是指程序代码的一次执行,是动态的过程。楼主在定义OneTh这个实现Runnable接口类的时候肯定复写了他的run()方法。onet1和onet2是两个线程,也就是说虽然他们的run()方法相同,但是是执行了两次的。
计算机中CPU的调度过程:现在的电脑看上去能同时实现多任务,像是一边上QQ,一边听音乐,还可以一边上网。但计算机中的CPU只有一个,它没有分身术,不可能真正意义上实现同时运行这么多程序。而是采用了一种时间片轮转的方式,为每个应用程序赋予极短的时间,然后高速的在不同的程序间切换,至于每次切换到那个程序,这个要由CPU和线程的优先级来决定。
线程的生命周期:创建时是初始化了这个线程,调用start方法时,是让这个线程进入了可运行状态,注意是可运行,不是正在运行。就像上面说的,在某一时刻CPU具体要运行谁是由CPU和线程的优先级决定的。当线程被CPU运行时,就会开始执行run方法,但可能执行到一半时,CPU又被其他可运行线程抢走,而只能暂停执行。
JAVA程序线程的运行:在我们使用java命令来运行程序时,这时候已经开始了两个线程,一个是main()方法的线程,一个是垃圾回收的线程。当楼主调用start方法开启另外两个线程时。这时候由于CPU来决定运行哪个线程。所以虽然noet1是先开启的,但在执行noet1时,CPU可能又去跑去执行main线程了,然后就会开启onet2.
还有我觉得主线程结束了,只不过其他两个线程仍在继续运行。所以会打印出结果。
楼主如果还有什么不明白的话可以继续问或者相互讨论。
这边我写了一个例子,两个线程同时获取随机数,当获取的值为68的时候则停止所有进程。
这是目录结构:MyThreadOne和MyThreadTwo是两个线程,TestMain是主函数,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;
}
}
//这边你结合自己的逻辑来写,总之,是通过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) {
//实例化两个线程获取到随机数为68时就停止进程,并输出
MyThread thread1 = new MyThreadOne();//实例化线程1
MyThread thread2 = new MyThreadTwo();//实例化线程2
threadPool.put("thread1", thread1);//将线程1放入线程池中
threadPool.put("thread2", thread2);//将线程2放入线程池中
thread1.start();//运行
thread2.start();
}
}
项目已经打包上传