关于多线程的一道题,有几个地方不懂!!

buchixiawen_li 2009-10-24 02:14:37
题目:
子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程
循环100次,如此循环50次,请写出程序.
以下这个题目的代码,我有几个地方看不懂,请懂的朋友解释一下,谢谢!


public class MemoryTest
{
public static void main(String[] args)
{
new MemoryTest().init();
}
protected static int LOOPCOUNT = 5;
public void init()
{
final Business bs = new Business();
new Thread()
{
public void run()
{
boolean bMale = false;
for(int n =1;n<=LOOPCOUNT;n++)
{
bs.subMethod(n);
}
}

}.start();

new Thread(new Runnable()
{
public void run()
{
for(int n =1;n<=LOOPCOUNT;n++)
{
bs.mainMethod(n);
}
}

}).start();
}
}
class Business
{
boolean bShouldSub = true;
public synchronized void subMethod(int num)
{
try
{
if(!bShouldSub) //这个IF语句是什么意思?
{
this.wait(); //这条语句在这里起什么作用?
}
Thread.sleep(100); //为什么这里要加上一条这个语句?
for(int i=0;i<10;i++)
{
System.out.println(
Thread.currentThread().getName() + ": loop of " + i+ ":" + " time of " + num);
}
bShouldSub = false;
this.notify();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}

public synchronized void mainMethod(int num)
{
try
{
if(bShouldSub) //这个IF语句是什么意思?
{
this.wait(); //这条语句在这里起什么作用?
}
Thread.sleep(100); //为什么这里要加上一条这个语句?
for(int i=0;i<5;i++)
{
System.out.println(
Thread.currentThread().getName() + ": loop of " + i + ":" + " time of " + num);
}
bShouldSub = true;
this.notify();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}

}

...全文
143 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这是很基础的线程


等待 唤醒 接收 。。。。。。
「已注销」 2009-10-27
  • 打赏
  • 举报
回复
其实这种,完全可以不用多线程来实现。


Runnable mainTask = new Runnable() {
public void run() {
// do sth
}
};
Runnable subTask = new Runnable() {
public void run() {
// do sth another
}
};

for (int i = 0; i < 50; i++) {
for (int j = 0; j < 10; j++)
subTask.run();
for (int j = 0; j < 100; j++)
mainTask.run();
}



ps:多线程是用来并发的,不是用来线性执行的。如果你的需求是固定的线性执行,那么还是不要用线程好了
CultureGraceful 2009-10-26
  • 打赏
  • 举报
回复
线程是有优先级的,你可以设置啊。如果没有设置优先级,那么肯定是看cpu了,它心情好,愿意运行那个就运行哪个。
buchixiawen_li 2009-10-25
  • 打赏
  • 举报
回复
上面我列出的代码中只有两个线程,第一个线程等待时,第二个线程运行.第二个线程等待时,第一个线程运行.

假如,在一个程序中出现了三四个线程,这该怎么办啊?A线程等待时,该哪个线程运行呢?
lmwf604 2009-10-25
  • 打赏
  • 举报
回复
借着学习一下线程问题,有收获
d3623301984 2009-10-25
  • 打赏
  • 举报
回复
楼上都说的很好了。。冒个泡
friendly_ 2009-10-25
  • 打赏
  • 举报
回复
初始 bShouldSub = true,执行subMethod的相关线程,mainMethod相关线程处于wait状态,subMethod循环完后,置bShouldSub =false通过notify唤起mainMethod线程即执行mainMethod,mainMethod执行完后再置bShouldSub=true
使其线程处于wait状态,通过notify唤起subMethod的相关线程
buchixiawen_li 2009-10-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 spwwzh 的回复:]
if(!bShouldSub)    ---判断该执行哪个线程

this.wait();        ----让当前执行线程上的对象处于等待状态。


Thread.sleep(100);  ----当前线程睡眠100毫秒(此语句为保险起见,可有可无)

[/Quote]

怎么判断当前执行线程上的对象是哪个呀?
spwwzh 2009-10-24
  • 打赏
  • 举报
回复
if(!bShouldSub) ---判断该执行哪个线程

this.wait(); ----让当前执行线程上的对象处于等待状态。


Thread.sleep(100); ----当前线程睡眠100毫秒(此语句为保险起见,可有可无)
zzu_sun 2009-10-24
  • 打赏
  • 举报
回复
if(!bShouldSub) //如果不等于 bshouldSub
{
this.wait(); //处于等到状态 }
Thread.sleep(100); //休眠100毫秒 给别的线程执行的机会

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧