【发布时间】:2013-08-19 03:52:55
【问题描述】:
检查此代码
Thread t1 = new Thread(new Runnable() {
@Override
public void run()
{
try
{
System.out.println("STARTING SERVER...");
ServerSocket s = new ServerSocket(2544);
System.out.println("SERVER BLOCKED ON ACCEPT");
Socket ss = s.accept();
System.out.println("SERVER NOT BLOCKED ANYMORE");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run()
{
try
{
while(true)
{
Thread.sleep(1000);
System.out.println("Hello");
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
});
t2.start();
输出:
STARTING SERVER...
SERVER BLOCKED ON ACCEPT
Hello
Hello
Hello
Hello
Hello
Hello
Hello
...
Java 线程应该是用户空间线程,对吧?所以一个被阻塞的线程应该阻塞整个过程......那不是发生的事情。他们怎么了?
【问题讨论】:
-
如果一个被阻塞的线程阻塞了整个进程,多线程的意义何在?
-
用户空间线程消耗更少的资源,因为它们不必加载内核线程的程序计数器、堆栈等
-
@fredcrs 是的,但它们实际上并不能很好地工作。
-
当两个主题都 100% 占用 CPU 时,它们可能会很有用。所以内核不会花时间切换上下文
-
上下文切换开销仅在极少数情况下才会变得明显 - 准备就绪的线程比内核多,并且这些线程使用的数据太多以至于需要刷新大部分 L1 缓存。并不是所有的应用都是这样的。
标签: java multithreading kernel