A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-13 08:01  /  1377 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 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亿个线程实例,会不会有问题?应该如何处理?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

1 个回复

倒序浏览
首先你是否理解了什么是线程?

线程是,是程序流(也就是一串汇编代码)的控制流,你可以理解为一个箭头→,指在代码上,会按照程序流的顺序执行下去

在设计程序是,你可以创建多线程(也就是多个箭头→),你可以理解为,某段代码,被多个箭头一起指着,他们都有执行权也就是线程并发,谁抢到CPU资源了,谁就可以继续走向下走一步(抢到的可能性是随机的,但是和线程的优先级有关)




线程分以下几个形态
初始,等待,阻塞,就绪,执行

所以
多个线程无限的在执行,而且顺序并不是从1到100,而是乱的

是因为线程并发,他们都有执行权,因为都在就绪状态,谁抢到CPU谁就进入执行状态,所以你看到的顺序是乱的


如果我采用stoped()方法来停止,我在main方法中如何调用?
回答:请看JDK,stopped方法已经被停用,过时了……不安全,你可以停止一个尚未启动的线程,但是如果它已经启动,则会被终止!


如何才能让线程一个接着一个的去执行?如何控制?
一个接着一个:你可以使用join的方法去强行抢占main资源,第一个线程不执行完,不去执行之后的代码
控制:你也可以采用flag的方法,建立一个while判断,如果flag == false 则不执行同步代码块


其次,如果我的主程序中的循环量很大,比如说1亿次,甚至是100亿次,那将会产生100亿个线程实例,会不会有问题?应该如何处理?
用同步代码块可以解决这些问题,当然。。真的算那么多次,是在搞科研么?100亿个线程…也是个不实际的问题…开辟空间资源会不够用的哦,实际开发中不会遇到这样的事情
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马