我想了解这些类型的线程提供的优势.
在什么环境下绿色线程比非绿色更好?有人说绿色线程更适合多核处理器.
任何预期的行为问题.
检查此代码
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();
Run Code Online (Sandbox Code Playgroud)
输出:
STARTING SERVER...
SERVER BLOCKED ON ACCEPT
Hello
Hello …Run Code Online (Sandbox Code Playgroud) 我正在阅读线程和进程之间的差异,并且几乎在网上到处都是,一个差异通常没有太多解释:
如果一个进程被阻塞,剩余的进程可以继续执行。如果一个用户级线程被阻塞,它的所有对等线程也会被阻塞。
这对我没有任何意义。如果调度程序不能在阻塞线程和就绪/可运行线程之间切换,那么并发的意义是什么。给出的原因是,由于操作系统不区分给定父进程的各个线程,因此它会立即阻止所有线程。
我觉得这很不令人信服,因为所有现代操作系统都有带有线程 ID 的线程控制块,即使它仅在父进程的内存空间内有效。就像 Galvin 的《操作系统》一书中给出的示例一样,如果拼写检查线程无法连接到某个在线词典,我不希望正在处理我的打字的线程被阻塞。
要么我对这个概念的理解有误,要么所有这些网站多年来都只是复制了一些旧的线程差异。此外,我在书中找不到这种说法,例如 Galvin 的书或 William Stalling 的 COA 书,其中讨论了线程。
提前致谢。
编辑: 这些是我找到语句的资源:
java multithreading operating-system cpu-architecture green-threads
在维基百科上:Green_threads被描述为通常不能在多核上运行而不解释原因.
在多核处理器上,本机线程实现可以自动将工作分配给多个处理器,而绿色线程实现通常不能.
我理解本机线程可以由OS分配给多核.有人可以解释为什么绿色线程不能在多核上运行吗?是因为绿色线程是从本机线程派生/生成的,它们无法从本机线程移动到另一个线程?