Jvm可以创建多少个线程
测试1.0
public class TEst {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
for(;;) {
Thread t = new Thread(mr, "线程个数: ");
t.start();
}
}
public class MyRunnable implements Runnable {
public static int count = 0;
@Override
public void run() {
count += 1;
System.err.println(Thread.currentThread().getName() + count);
}
}
失败原因:
线程 属于一次性消耗品,在执行完run ()方法之后线程便会正常结束了,线程结束后便会销毁,不能再次start,只能重新建立新的线程对象。导致线程每次都重新开始。没有尽头。
解决办法:
在MyRunnable中让线程在run()中,一直睡。
测试2.0
public class TEst {
public static void main(String[] args) {
for (;;){
new Thread(new SomeRunnable(),"线程数").start();
}
}
}
public class MyRunnable implements Runnable {
public static int count = 0;
private static Object s = new Object();
@Override
public void run() {
count += 1;
System.err.println("New thread #" + count);
for (; ; ) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.err.println(e);
}
}
}
}
出现线程安全问题:线程个数并不是有序排列的
解决办法:
让其线程同步,加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证了该变量的唯一性和准确性。 即有synchronized关键字修饰的方法。 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
测试3.0
public class TEst {
public static void main(String[] args) {
for (;;){
new Thread(new SomeRunnable(),"线程数").start();
}
}
}
public class MyRunnable implements Runnable {
public static int count = 0;
private static Object s = new Object();
@Override
public void run() {
synchronized (s) {
count += 1;
System.err.println("New thread #" + count);
}
for (; ; ) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.err.println(e);
}
}
}
}
测试成功
出现:an unrecoverable stack overflow has occurred.发生了无法恢复的堆栈溢出。表示系统的物理内存不足。
结论:jvm在本机可以创建125383左右个线程。