Java基础复习——多线程

来源:互联网 发布:mac finder经典页面 编辑:程序博客网 时间:2024/06/03 21:34

1 Thread类

1.1 interupt方法的demo

// file name: MyRunnable.javapublic class MyRunnable implements Runnable {    public int name = 0;    @Override    public void run() {        while (true) {            System.out.println("my name is " + name);            try {                Thread.sleep(5000);            } catch (InterruptedException e) {                e.printStackTrace();                //当调用thread.interrupt()时会立马停止Thread.sleep(100)                //并抛出异常,这个时候在catch语句中加入break跳出循环体即可结束线程。                break;            }        }    }}

测试类:

public class ThreadDemo {    public static void main(String[] args) {        MyRunnable mr = new MyRunnable();        mr.name = 1;        Thread thread = new Thread(mr);        thread.start();        // add debug breakpoint        thread.interrupt();    }}

1.2 测试win7系统支持的最大线程数(由于8GB内存不够,没测出来)

线程类:

public class MyRunnable implements Runnable {    public int name = 0;    @Override    public void run() {        while (true) {            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();                break;            }        }    }}

测试类:

public class ThreadDemo {    public static void main(String[] args) {        List<Thread> list = new ArrayList<>();        for (int j = 0; j<100; j++) {            System.out.println("\n\n\n\n------------------" + list.size() + "\n------------------------\n\n\n\n\n");            try {                Thread.sleep(5000);            } catch (InterruptedException e) {                e.printStackTrace();            }            for (int i = 0; i < 1000; i++) {                MyRunnable mr = new MyRunnable();                mr.name = i;                Thread thread = new Thread(mr);                list.add(thread);                thread.start();            }        }    }}

结果:14,000线程时,我的电脑的8GB的内存撑不住了
这里写图片描述
改进后进程类:

public class MyRunnable implements Runnable {    @Override    public void run() {        while (true) {            try {                Thread.sleep(100000);            } catch (InterruptedException e) {                e.printStackTrace();                break;            }        }    }}

改进后测试类:

public class ThreadDemo {    public static void main(String[] args) {        for (int j = 0; j<100; j++) {            System.out.println("\n\n\n\n------------------" + (j+1)*1000 + "\n------------------------\n\n\n\n\n");            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            for (int i = 0; i < 1000; i++) {                MyRunnable mr = new MyRunnable();                Thread thread = new Thread(mr);                thread.start();            }        }    }}

改进后结果:100,000线程,内存满了,但是会自动清理。
图中最后内存占用跳水是因为我杀掉了jvm
这里写图片描述

以下内容没有验证过,是linux下的

转自http://blog.csdn.net/u013673976/article/details/51788566

 系统可生成最大线程数cat /proc/sys/kernel/threads-max这个值很大,tomcat进程的全部线程数肯定没有超过它,如果实际线程数比它大可改大(实际可能是代码问题,开启了太多线程)。进程最大线程数ps -eLf | grep 项目名 | wc -l 查看单个项目线程数,启动失败的这个项目线程数一般在600左右cat /proc/sys/vm/max_map_count65530这个值没有问题,jvm的启动参数为-Dconfig.server.maxThreads=3000,也没有问题用户最大进程数ulimit -a其中max user processes就是表示用户的最大进程数,我的这个值很大,进程数也没有超过它。如果超过的话,可以修改最大进程数的配置vi /etc/security/limits.d/90-nproc.conf* soft nproc 1024root soft nproc unlimited上面可以看除了root用户外的所有用户均限制为1024,因此通过可以注释此行或者将值改大,保存后修改立刻生效#* soft nproc 1024root soft nproc unlimited整个系统已用的线程或进程数cat /proc/sys/kernel/pid_max该值是3267832位Linux系统可创建的最大pid数是32678),查询当前整个系统已用的线程或进程数:pstree -p | wc -l,结果比32678稍小,问题就在这了vim /proc/sys/kernel/pid_max,改为65535保存退出的时候报错如下/proc/sys/kernel/pid_max E667 Fsync failed改成下面方式即可:echo "65535" > /proc/sys/kernel/pid_max不需要重启,保存后立刻生效,重启项目终于好了
原创粉丝点击