黑马程序员技术交流社区
标题:
关于多线程的问题
[打印本页]
作者:
小黑-张颖
时间:
2011-9-3 19:25
标题:
关于多线程的问题
。。。。。
前面的一些代码我就省略了
public static void main(String[] args)
{
Runnable mt1=new MyThread();
Runnable mt2=new MyThread();
new Thread(mt1).start();
new Thread(mt2).start();
}
class MyThread implements Runnable
{
public void run()
{for(int i=0;i<5;i++)
System.out.println(Thread.currentThread().getName()+":"+"i");
}
}
从这个程序里面,打印的结果是:
Thread-0:0
Thread-1:1
Thread-0:2
Thread-1:3
Thread-0:4
我的问题是多线程不是同步执行的吗?
如果是这样,那打印结果应该是这样
Thread-0:0
Thread-1:0
......
同步执行
求解
作者:
匿名
时间:
2011-9-3 20:19
我将你的代码复制运行了,没有问题,当然其中把打印时的i旁边的双引号去掉,结果如下
Thread-1:0
Thread-1:1
Thread-1:2
Thread-1:3
Thread-1:4
Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4完全没有问题,可以说你上面这段代码是没有问题的。其实多线程所谓的同步并不是真的同步,而是计算机执行分别执行一个线程一会儿,几个线程交替执行,而同一时间内只有一个线程在执行,由于速度非常非常快,所以看作同步,但是由于现在cpu实现了多核多线程,那倒是真的可以做到同步。至于你为什么会有那样的结果,我觉的应该是其他原因引起的,不知是不是你省略的那部分代码引起的。
作者:
匿名
时间:
2011-9-3 23:55
你想要的效果应该是这样的吧[code]class MyThread implements Runnable{ // 实现Runnable接口,作为线程的实现类
private String name ; // 表示线程的名称
public MyThread(String name){
this.name = name ; // 通过构造方法配置name属性
}
public void run(){ // 覆写run()方法,作为线程 的操作主体
for(int i=0;i<10;i++){
System.out.println(name + "运行,i = " + i) ;
}
}
};
public class RunnableDemo01{
public static void main(String args[]){
MyThread mt1 = new MyThread("线程A ") ; // 实例化对象
MyThread mt2 = new MyThread("线程B ") ; // 实例化对象
Thread t1 = new Thread(mt1) ; // 实例化Thread类对象
Thread t2 = new Thread(mt2) ; // 实例化Thread类对象
t1.start() ; // 启动多线程
t2.start() ; // 启动多线程
}
};[/code]输出的结果:
线程A 运行,i = 0
线程A 运行,i = 1
线程B 运行,i = 0
线程A 运行,i = 2
线程B 运行,i = 1
线程A 运行,i = 3
线程B 运行,i = 2
线程A 运行,i = 4
线程B 运行,i = 3
线程A 运行,i = 5
线程B 运行,i = 4
线程A 运行,i = 6
线程B 运行,i = 5
线程A 运行,i = 7
线程B 运行,i = 6
线程A 运行,i = 8
线程B 运行,i = 7
线程A 运行,i = 9
线程B 运行,i = 8
线程B 运行,i = 9
谁抢到CPU的资源了 谁就运行
作者:
724681149
时间:
2011-10-15 15:22
强烈建议楼主看看基础加强的视频,你创建线程的方式太烂了,可读性太差了。
作者:
想好了再写
时间:
2011-10-15 21:42
你会慢慢的发现,你的这个程序每执行一次,结果都是不一样的,每运行一次结果就会改变一次
其实说是同步如果从cpu的角度来讲也不算是同步,只是比原来的单线程的效率高了一些,学习组成原理你会知道,cpu不可能同时运行两个线程(双核cpu不确定)一个时间点只有一个线程在运行,同步多线程是在一个CPU 的时钟周期内能够执行来自多个线程的指令。也就是说原来单线程,主函数只能等待调用函数执行完后自己再继续执行,在一个时间点是一个线程在执行;而多线程同步是 主函数 在其调用的函数执行的时候,它跟调用函数分时段分别执行,也就是说在cpu那里是一人执行一段时间,在一个时间点上仍然是一个线程在执行。声明的是,一个时间点上cpu只能执行一个线程,你就可以明白为什么你认为的结果不对了。词不达意,不知道能看懂不。
作者:
想好了再写
时间:
2011-10-15 21:43
突然发现我文字表达能力这么的差{:soso_e118:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2