进程池进程执行顺序

山口山 2011-09-29 08:18:33

pullic class ThreadCooperation
{
public static void main(String[] args)
{
ExecutorService executor = Executors.newFixedThreadPool(2);
//DepositTask、WithdrawTask是实现了Runnable接口的类,都定义了run()方法。
executor.execute(new DepositTask());
executor.execute(new WithdrawTask());
System.out.println("...(略)");
}
}

这是main函数的一部分,在运行程序的时候,总是main函数的println方法先打印,再是进程池的两个进程打印出来。不解!
...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
山口山 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 aqqbjlgu 的回复:]

线程执行顺序是CPU决定的,你可以让main所在线程sleep久点!
[/Quote]
我试了一下,在println前加了几句:

try
{
Thread.sleep(1000);
}
catch(Exception e){}

最后的结果显示先其他线程的println执行,后再是main线程的println执行。
可为什么原来的程序一直是main线程呢,是不是先运行main线程,运行到启动其他线程的时候,main线程时间片还没到期.所以先出System.out.println?
山口山 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bao110908 的回复:]

你这是线程池,不是进程池,Java 是以单进程方式运行的,呵呵。
[/Quote]
嗯,老是搞混了……
aqqbjlgu 2011-09-30
  • 打赏
  • 举报
回复
线程执行顺序是CPU决定的,你可以让main所在线程sleep久点!
aqqbjlgu 2011-09-30
  • 打赏
  • 举报
回复
线程执行顺序是CPU决定的!要其余线程先执行的话,可以要main方法所在线程sleep()久点!
山口山 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mengxiangyue 的回复:]

楼主java支持的是抢占式的进程调度,但是java虚拟机是运行在操作系统上的,操做系统就会有时间片原则,是因为时间片的原则引起的,楼主不懂时间片的话可以百度下
[/Quote]
但问题就在这:main中的println方法也有可能在DepositTask线程或者WithdrawTask线程之后执行,可运行结果总是main的println最先执行……
是mian优先级别更高么?
山口山 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bao110908 的回复:]

你这是线程池,不是进程池,Java 是以单进程方式运行的,呵呵。
[/Quote]
嗯,我搞混了。我的疑问是:解释器给main方法启动了个线程,既然这三个线程共享CPU时间,那main中的println不是在另外两个线程执行后执行也有可能么?但输出结果老是main的println在最前面……
thegodofwar 2011-09-30
  • 打赏
  • 举报
回复
在你的电脑是单核的情况下,main线程确实优先执行,即使你在主线程里加了Thread.sleep(xxx);它实际上也是最先执行main线程的,只不过是main线程发现自己要睡会有空闲段,所以才去执行其他子线程,但是如果你的电脑是多核的,这种情况就不一定了,你可以用多核电脑试试(曾经碰到过,个人总结,不权威阿)
  • 打赏
  • 举报
回复
你这是线程池,不是进程池,Java 是以单进程方式运行的,呵呵。
孟祥月 2011-09-29
  • 打赏
  • 举报
回复
楼主java支持的是抢占式的进程调度,但是java虚拟机是运行在操作系统上的,操做系统就会有时间片原则,是因为时间片的原则引起的,楼主不懂时间片的话可以百度下
山口山 2011-09-29
  • 打赏
  • 举报
回复
为什么是main函数的println先执行呢?
山口山 2011-09-29
  • 打赏
  • 举报
回复

import java.util.concurrent.*;
import java.util.concurrent.locks.*;
public class ThreadCooperation
{
private static class Account
{
private static Lock lock=new ReentrantLock();
private static Condition newDeposit=lock.newCondition();
private int balance=0;
public int getBalance()
{
return balance;
}
public void withdraw(int amount)
{
lock.lock();
try
{
while(balance<amount)
newDeposit.await();
balance-=amount;
System.out.println("\t\t\tWithdraw"+amount+"\t\t"+getBalance());
}
catch(Exception e)
{
}
finally
{
lock.unlock();
}
}
public void deposit(int amount)
{
lock.lock();
try
{
balance+=amount;
System.out.println("Deposit"+amount+"\t\t\t\t\t"+getBalance());
newDeposit.signalAll();
}
finally
{
lock.unlock();
}
}
}
private static Account account=new Account();

public static class DepositTask implements Runnable
{
public void run()
{
try
{
while(true)
{
account.deposit((int)(Math.random()*10)+1);
Thread.sleep(1000);
}
}
catch(Exception e)
{
}
}
}
public static class WithdrawTask implements Runnable
{
public void run()
{
while(true)
account.withdraw((int)(Math.random()*10)+1);
}
}
public static void main(String[] args)
{
ExecutorService executor=Executors.newFixedThreadPool(2);
executor.execute(new DepositTask());
executor.execute(new WithdrawTask());
executor.shutdown();
System.out.println("Thread 1\t\tThread 2\t\tBalance");
}
}

这是完整的程序

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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