qq_慕莱坞3428004
Thread是一个类(class),Actor继承类的时候需要用 “extends”;
Runnable是一个接口(interface),Actress实现接口的时候用“implements”;
慕码人4120781
没什么区别 , Thread类本质上也是实现了Runnable接口 , 由于类单继承以及接口多继承 , 推荐用Runnable接口 , 因为可能你的类需要继承别的类 , 不管是通过继承类还是实现接口来实现多线程 , 最终都是通过Thread的对象的API来控制线程的
qq_俯仰满天星_0
应该new Actor(); new Thread();是错误的!!!
窝窝头不要钱
Actress类的位置错了
应该放在Actor类的外面
只想当咸鱼的的胖龙
那不是快捷键,只不过是出错了,把鼠标放到出错信息那点击
葛丹儿
他实现了Runnable接口 所以可以直接调用
qq_慕函数8456880
学了操作系统,你应该知道一些进程调度算法吧。先生在调用Thread.sleep(1000)后,表明 在接下来的 1000ms内 先生不参与CPU的竞争,1000ms结束时,cpu并不一定分配给先生,因为windows 的操作系统采用的是 抢占式进程调度算法,进程的优先级 根据等待时间或其它因素 是动态变化的,这时候可能会有 其它进程的优先级比“先生”高,因此先生只能等着。因为 先生 和 女士 的优先级不停变化,所以可能会不规律的被调度。
qq_慕函数8456880
class Actress implements Runnable{
public void run() {
System.out.println(Thread.currentThread().getName()+"是一个演员");
int count=0;
boolean keepRuning=true;
while(keepRuning) {
System.out.println(Thread.currentThread().getName()+"登台演出"+(++count));
if(count==100) {
keepRuning=false;
}
if(count%10==0) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName()+"演出结束了");
}
}
这个class Actress叫做内部类,他和public class Actor是同级的,所以Actress应该放在Actor的大括号的外面。
Knight_152
666
xuxuisahappynut
你绝对是直接 调用了 线程的 run() 方法,而不是 start() 方法
慕妹5624232
Actress继承自Runnable接口,接口没有任何的实现代码。而Actress类本身也没有setName方法,因此JVM找不到setName方法会报错
慕设计7579901
Java的异常检查机制自动提醒在可能出现异常的地方让你用try catch这个是固定写法,就像公共场所总会有灭火设备一样。
断弦之殇
actor就是Thread线程类的子类啊,用了extends,所以可以用父类方法
慕移动6439340
写继承关系了吗
慕粉144842349
这个本来就是cpu自动决定谁先走,谁后走的,可以用sleep方法控制你想要控制的进程啊
壹酒酒柒
继承Thread和实现Runnable其区别主要在于共享数据,Runnable接口是可以共享数据的,多个Thread可以同时加载一个Runnable,当各自Thread获得CPU时间片的时候开始运行Runnable,Runnable里面的资源被共享。
而例子中
class Actress implements Runnable{
static int count = 0;
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "是一个演员!");
boolean courrent = true;
while(courrent) {
System.out.println(Thread.currentThread().getName() + "登台演出第" + (++count) + "场次!");
if(count>=100){
courrent = false;
}
if(count%10 == 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName() + "演出结束了");
}
}与
public class Actor extends Thread {
static int count = 0;
public void run() {
System.out.println(getName() + "是一个演员!");
boolean courrent = true;
while(courrent) {
System.out.println(getName() + "登台演出第" + (++count) + "场次!");
if(count>=100){
courrent = false;
}
if(count%10 == 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(getName() + "演出结束了");
}
public static void main(String[] args) {
Thread actorThread = new Actor();
actorThread.setName("Mr.Thread");
actorThread.start();
Thread actress = new Thread(new Actress(),"Ms.Runnable");
actress.start();
}
}主要是说明不管是继承Thread还是实现Runnable接口我们都可以创建线程。在实际开发中大多数情况下是实现Runnable接口的,因为它可以共享数据。
新手白
就是这样啊,cpu来回切换线程
新手白
Actress的run方法没有逻辑代码,请问怎么出来???
江户川柯南_qq
android中,在线程中是不能对UI进行操作的,改变UI只能在主线程中进行。你这里MainActivity实现了Runnable接口,那它就是个线程,怎么还能在run()方法中去更改UI呢!不知道我这个理解对不对,仅供参考
RSF
结果不固定的,让出cpu后,两个线程同时竞争,所以运行结果不固定。。。
神亿般的存在
//内部类的话要用主类的实例去new一个内部类的实例对象,比如
Actress actress = new Actor().new Actress();
Thread actressThread = new Thread(actress,"Ms.Runnable");
actressThread.start();
//这样就行了~
慕斯卡3197864
嘿嘿,多运行几次你就会发现,结果不会总是一样的,多核计算机的时间片分配问题
qq_雨欲语_03900761
Actress是实现的接口,接口是不能new的。所以说只能new一个Actress类。然后传递到Thread()中。
慕粉4090544
在java中所有线程都是同时启动的,至于什么时候。哪个先执行哪个后执行,完全看谁先得到cpu,在运行时每次也不是只执行一个线程
皈依__
你把 第二个类写到第一个类里面了
public class XXX{
class XXX{}
} 这个错误
public class XXX{
}
class XXX{
} 这个正确
栗喵
如果都继承了Thread类的前提下,两种方式都可以创建一个线程对象,一般我们是使用第一种方式来创建线程对象(向上造型);PS:你的第二种方式是调用run方法,比不是让线程进入就绪状态(start());
qq_小幸运_21
第一个是匿名对象,new一个你实现Runnable接口的类的对象,第二个是给名字
Rdy2Die
你这个方法没有定义返回值,然后if条件语句里面那个return不能跳出循环,输出演出结束那句话永远也到不了,所以程序会报错,可以把return改成break就好了
程序员北巷
下面Actress加上statci就可以了,提问不能删除,就自己回了
慕粉4379728
因为子类重写了父类的run方法,父类对象不能调用子类的重写的run方法;也可以通过父类对象去引用子类对象去实现调用子类的run方法Thread actor = new Threadx();