黑马程序员技术交流社区
标题:
多线程代码问题
[打印本页]
作者:
邱成
时间:
2012-9-13 08:01
标题:
多线程代码问题
本帖最后由 邱成 于 2012-9-13 22:45 编辑
在一个循环中产生多个线程实例调用,程序如下:
public class testrun
{
public static void main(String[] args)
{
int i = 1 ;
for (i=1;i <100 ;i++ )
{
new test(i).start();
}
}
}
class test extends Thread
{
private int iNum = 0;
boolean stoped = false;
public test(int num)
{
this.iNum = num ;
}
public void run()
{
synchronized (this) {
while (!stoped)
{
try
{
this.sleep(30);
}catch(Exception e) {
//
}
System.out.println( "正在运行第 " + iNum + "个线程! ");
}
}
}
public void stoped()
{
this.stoped = true;
}
}
运行结果,多个线程无限的在执行,而且顺序并不是从1到100,而是乱的,如果我采用stoped()方法来停止,我在main方法中如何调用????如何才能让线程一个接着一个的去执行?如何控制?其次,如果我的主程序中的循环量很大,比如说1亿次,甚至是100亿次,那将会产生100亿个线程实例,会不会有问题?应该如何处理?
作者:
马睿
时间:
2012-9-13 12:29
首先你是否理解了什么是线程?
线程是,是程序流(也就是一串汇编代码)的控制流,你可以理解为一个箭头→,指在代码上,会按照程序流的顺序执行下去
在设计程序是,你可以创建多线程(也就是多个箭头→),你可以理解为,某段代码,被多个箭头一起指着,
他们都有执行权
也就是线程并发,谁抢到CPU资源了,谁就可以继续走向下走一步(抢到的可能性是随机的,但是和线程的优先级有关)
线程分以下几个形态
初始,等待,阻塞,就绪,执行
所以
多个线程无限的在执行,而且顺序并不是从1到100,而是乱的
是因为线程并发,他们都有执行权,因为都在就绪状态,谁抢到CPU谁就进入执行状态,所以你看到的顺序是乱的
如果我采用stoped()方法来停止,我在main方法中如何调用?
回答:请看JDK,stopped方法已经被停用,过时了……不安全,你可以停止一个尚未启动的线程,但是如果它已经启动,则会被终止!
如何才能让线程一个接着一个的去执行?如何控制?
一个接着一个:你可以使用join的方法去强行抢占main资源,第一个线程不执行完,不去执行之后的代码
控制:你也可以采用flag的方法,建立一个while判断,如果flag == false 则不执行同步代码块
其次,如果我的主程序中的循环量很大,比如说1亿次,甚至是100亿次,那将会产生100亿个线程实例,会不会有问题?应该如何处理?
用同步代码块可以解决这些问题,当然。。真的算那么多次,是在搞科研么?100亿个线程…也是个不实际的问题…开辟空间资源会不够用的哦,实际开发中不会遇到这样的事情
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2