慕函数5031531
打开你下载的压缩包不是有两个文件么,thread-in-imooc(也就是另外一个文件)里面有其他代码。
森森0515
其实老师的代码如果在双方军队战斗那加上sleep()方法的话,你会发现:程咬金先战斗完之后才是军队执行完
因此个人觉得应该在程咬金出厂后加入一个判断,如下所示:
//新建关键人物
KeyPerson keyPerson = new KeyPerson();
Thread chengYaojin = new Thread(keyPerson,"程咬金");
while(true){
if(!suiThread.isAlive() && !farmThread.isAlive()){
System.out.println("程咬金开始战斗!!"); chengYaojin.start(); //chengYaojin.join(); System.out.println("大戏结束!!!"); break; } }
chengYaojin.start();
chengYaojin.join();
System.out.println("大戏结束!!!");
break;
}
}这样的话才能使得双方军队退场后,程咬金才会上场,才符合逻辑。
qq_千寻_5
主角需要!
慕UI3421247
如果不加Thread.yield() 线程的执行就是按照一定规律顺序执行。不能制造出战场上的随意性。
慕数据8483959
你的意思是执行结果的交替,但是在线程执行中,是通过cpu分配时间进行的交替运行的
慕哥2554231
main方法本身也是线程,它只是开了一个线程,如果你在main再输出一个语句,有可能main先结束了,舞台线程还在执行;
因为程咬金要执行10次,如果不join,舞台不一定会等他执行结束再执行,而军队线程前面已经被setfalse了。
不知道解释的对不对,我是这么理解的。
慕娘5114374
兄弟你牛啊,听了你的解释后,恍然大悟啊
_细嗅蔷薇
视频里是写死的for循环
慕UI1804229
由于java是单继承的语言,所以在已经继承了其他类又想同时实现线程操作的时候就可以实现runable接口。如下代码所示,实现了runable接口的类(runner1是这个类的实例)在开启新线程的时候还是需要thread来辅助的
Thread thread1 = new Thread(runner1);
thread1.start();
艾米丽宏
我的理解是这样的 既然是多线程,多天线程同时进行,在农民和隋军的那两条线程进行的同时,就是main下的主线程也在运行(Stage),它在执行农民和隋军的线程的同时,也在一直往下运行,运行到armyTaskOfSuiDynasty.keepRunning=false;
armyTaskOfRevolt.keepRunning=false;
农民和隋军的线程自然也就停止了。
神亿般的存在
应该是控制台显示的内容有限,而输出的内容太多了,所以刚开始的内容已经不显示了。
你可以修改队伍进攻时间,即
//舞台线程休眠,大家专心观看军队厮杀
try {
Thread.sleep(50);//这个修改成50毫秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}这样应该就能看到了刚开始的旁白了。
qq_杀意隆_0
这篇文章说得很清楚了。
当前的线程阻塞,等待调用join()的线程执行。当前的线程可以是 “调用了join()的线程之外的任意线程”。
join是Thread的实例方法,官方解释为:等待该线程终止。
其作用就是将调用join的线程优先执行,当前正在执行的线程阻塞,直到调用join方法的线程执行完毕或者被打断,主要用于线程之间的交互。
还有两个重载的方法:
1、join(long millis),等待该线程终止的时间最长为 millis 毫秒。为 0 意味着要一直等下去。
2、join(long millis, int nanos),等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒
慕仙2287467
nong.keepRunning=false的时候,农名的线程还在while里面执行for循环,所以才会输出for循环剩余的2,3,4,5.等到下一次做while判断的时候,发现keepRunning标志为false了,才会结束线程。如果想把程咬金结束战争的字幕打印到最后,可以sleep一下主线程,或者调用sui和nong线程的join()方法。
慕仔1575412
你要知道 在ArmyRunnable 类 中 while(keepRunning) 这里是用的while 而不是if,while会一直判断,if只会判断一次,就是你在ArmyRunnable中的初始值!
福工刘德华
大兄弟,那不是快捷键,,那是视频剪辑的问题,不是点了thread 后弹出来的方法补充。 继承一个类也基本不会出现一个方法继承的警告吧,如果你说要快速, 你可以直接写一个run 智能提示alt+/ 能帮你快速生成。。。
16k闪存大脑3954634
同问?
华序
结合代码和ppt,再使用屏幕录制专家,就可以搞定了
慕移动3506833
在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable targer)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。(start()可以协调系统的资源)
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享
宝慕林4765958
join方法是等待该线程终止,不能终止进程,那两个false是终止进程
宝慕林4765958
其实stage线程和军队线程之间是没有关系的,只是stage线程让军队线程开始执行而已。一个线程可以理解为一段代码,线程相互之间没有关系,除非对公共资源进行读取或修改
我也是猫
Thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
qq_绿川夏_03247384
两个军队的线程都停止。舞台并没有停止
join()应该就是阻塞(这个不结束,不继续运行),你不阻塞,线程程咬金还在运行,调用线程的舞台就结束了
秦家小小神
你代码顺序错了,应该先停止双方线程,然后再让关键线程运行。
慕侠0844227
是的啊 很搞笑 也比较易懂
qq_GuardYou_0
你要把stage那部分粘出来啊,估计是join那里出问题了吧
mudiss
厉害了
qq_天空之城_19
KeepRunning 是军队类的一个属性,用于让while判断是否继续循环
你看下是不是写在军队类的run方法里面了,它应该是类的一个属性
wendy4165364
public class Stage extends Thread {
public void run() {
System.out.println("舞台线程");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("大幕徐徐拉开");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
ArmyOfSuiDynasty armyOfDynasty = new ArmyOfSuiDynasty("朝廷军");
ArmyOfSuiDynasty armyOfFamer = new ArmyOfSuiDynasty("农民军");
// 用Runnable接口创建线程
Thread armyTaskOfSuiDynasty = new Thread(armyOfDynasty, "朝廷军线程");
Thread armyTaskOfFamer = new Thread(armyOfFamer, "农民军线程");
// 启动线程,让军队开始作战
armyTaskOfSuiDynasty.start();
armyTaskOfFamer.start();
// //让主线程进入休眠状态,让出处理时间
// try {
//
// Thread.sleep(1);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// 将作战指令设为停止
armyOfDynasty.keepRunning = false;
armyOfFamer.keepRunning = false;
try {
armyTaskOfFamer.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
Stage s = new Stage();
s.start();
}
}
慕粉2220415365
java多线程可以近似看成同时执行,不过本质上计算机能同时工作的线程数是有限个的(取决于你的CPU)
老师演示的时候农民军和隋军交替结果看起来应该是至少有两个线程是同时工作的。而你这个明显是仅分配给了这个程序一个线程。
多线程是为了解决某些应用上需要等待其他的结果(比如浏览器访问一个网址需要等待服务器返回HTML文件才能继续执行显示页面的操作)才能继续执行,那么这段时间cpu可以去执行其他线程的程序。但是如果这个线程可以一口气执行下去的话,中途其他线程是没有办法执行的。
-----------------以下是针对代码的--------------------------
你只有一个线程能同时工作。那么两个军队的线程启动后是处于等待状态的,并没有真的执行。
然后舞台线程没有看见sleep(就是你删去的那个)所以继续执行下去,输出,关键人物的生命,设置名字,再一个输出,然后直接就执行到了keeprunning=false的两句。
再之后看见sleep,关键人物线程和两个军队线程争用cpu,不过两个军队线程即使争用到cpu也会因为keeprunning导致线程直接结束,那么舞台线程休眠的时间(这个是确定的值,没到的话再找个线程执行)就只有关键人物有输出操作,关键人物操作以后舞台线程也到了时间的话,舞台线程占用cpu,继续执行。
java初学,为个人理解所得,dalao请轻喷
水纹