zoukankan      html  css  js  c++  java
  • linux查看进程中线程及线程池

    1 lsof -i :8084 查看端口程序

    2.top -H -p #pid查看相关线程,找出最占资源的线程

    3.printf '0x ' #线程ID(即2中pid)得到线程ID的16进制

    4.jstack #pid|grep -A 10 线程ID的16进制

    查看进程中所有的线程

    jstack #pid|grep nid=0x

    查看gc相关的线程号

    jstack #pid| grep nid=ox| grep GC | awk '{print "pid=" strtonum("0x"substr($7,7,12))"  " $0}'

    查看自定义线程池(线程池的名字为xxxTreadPool)相关的线程号

    jstack #pid|grep TreadPool- |awk '{print "pid=" strtonum("0x"substr($6,7,12))"  " $0}'

    查看http-nio-线程

    jstack #pid|grep http-nio- |awk '{print "pid=" strtonum("0x"substr($7,7,12))"  " $0}'

    springboot web程序举例

    查看pid

    top -H -p 122349

     

    ps -T -p 122349

     

     spring boot web程序进程相关线程

    jstack 122349|grep nid=0x|awk '{from=(index($0,"nid=0x")+6);to=(from+5);pid=substr($0,from);pid=substr(pid,0,5);pid=strtonum("0x"pid);print "pid="pid " "  substr($0,0,100)}'

     结果:黄色部分为自定义线程池,绿色部分为容器相关的线程,剩余是top能看到进程

    pid=122941 "ScheduledThreadPool-1-thread-5" #43 prio=5 os_prio=0 tid=0x00007f3ba8004800 nid=0x1e03d waiting on 
    pid=122940 "ScheduledThreadPool-1-thread-4" #42 prio=5 os_prio=0 tid=0x00007f3b98001000 nid=0x1e03c waiting on 
    pid=122939 "ScheduledThreadPool-1-thread-3" #41 prio=5 os_prio=0 tid=0x00007f3ba8002800 nid=0x1e03b waiting on 
    pid=122937 "ScheduledThreadPool-1-thread-2" #40 prio=5 os_prio=0 tid=0x00007f3ba8001000 nid=0x1e039 waiting on 
    pid=122935 "CustomizedThreadPool-1-thread-3" #39 prio=5 os_prio=0 tid=0x00007f3bf8175000 nid=0x1e037 waiting on
    pid=122934 "CustomizedThreadPool-1-thread-2" #38 prio=5 os_prio=0 tid=0x00007f3bf8173000 nid=0x1e036 waiting on
    pid=122933 "CustomizedThreadPool-1-thread-1" #37 prio=5 os_prio=0 tid=0x00007f3bf818e000 nid=0x1e035 waiting on
    pid=122932 "ScheduledThreadPool-1-thread-1" #36 prio=5 os_prio=0 tid=0x00007f3bf818b800 nid=0x1e034 waiting on 
    pid=122931 "FixedThreadPool-1-thread-3" #35 prio=5 os_prio=0 tid=0x00007f3bf8189800 nid=0x1e033 waiting on cond
    pid=122930 "FixedThreadPool-1-thread-2" #34 prio=5 os_prio=0 tid=0x00007f3bf8188000 nid=0x1e032 waiting on cond
    pid=122929 "FixedThreadPool-1-thread-1" #33 prio=5 os_prio=0 tid=0x00007f3bf8191000 nid=0x1e031 waiting on cond
    pid=122583 "Attach Listener" #32 daemon prio=9 os_prio=0 tid=0x00007f3c2c001000 nid=0x1ded7 waiting on conditio
    pid=122350 "DestroyJavaVM" #31 prio=5 os_prio=0 tid=0x00007f3c74009000 nid=0x1ddee waiting on condition [0x0000
    pid=122387 "http-nio-8084-Acceptor-0" #29 daemon prio=5 os_prio=0 tid=0x00007f3c74ef0000 nid=0x1de13 runnable [
    pid=122386 "http-nio-8084-ClientPoller-1" #28 daemon prio=5 os_prio=0 tid=0x00007f3c75263800 nid=0x1de12 runnab
    pid=122385 "http-nio-8084-ClientPoller-0" #27 daemon prio=5 os_prio=0 tid=0x00007f3c750a1800 nid=0x1de11 runnab
    pid=122384 "http-nio-8084-exec-10" #26 daemon prio=5 os_prio=0 tid=0x00007f3c7527a800 nid=0x1de10 waiting on co
    pid=122383 "http-nio-8084-exec-9" #25 daemon prio=5 os_prio=0 tid=0x00007f3c7438a000 nid=0x1de0f waiting on con
    pid=122382 "http-nio-8084-exec-8" #24 daemon prio=5 os_prio=0 tid=0x00007f3c75087800 nid=0x1de0e waiting on con
    pid=122381 "http-nio-8084-exec-7" #23 daemon prio=5 os_prio=0 tid=0x00007f3c750f5000 nid=0x1de0d waiting on con
    pid=122380 "http-nio-8084-exec-6" #22 daemon prio=5 os_prio=0 tid=0x00007f3c750f7000 nid=0x1de0c waiting on con
    pid=122379 "http-nio-8084-exec-5" #21 daemon prio=5 os_prio=0 tid=0x00007f3c74cec800 nid=0x1de0b waiting on con
    pid=122378 "http-nio-8084-exec-4" #20 daemon prio=5 os_prio=0 tid=0x00007f3c74ef5000 nid=0x1de0a waiting on con
    pid=122377 "http-nio-8084-exec-3" #19 daemon prio=5 os_prio=0 tid=0x00007f3c7477b000 nid=0x1de09 waiting on con
    pid=122376 "http-nio-8084-exec-2" #18 daemon prio=5 os_prio=0 tid=0x00007f3c74e9e000 nid=0x1de08 waiting on con
    pid=122375 "http-nio-8084-exec-1" #17 daemon prio=5 os_prio=0 tid=0x00007f3c74f1f800 nid=0x1de07 waiting on con
    pid=122374 "NioBlockingSelector.BlockPoller-1" #16 daemon prio=5 os_prio=0 tid=0x00007f3c74f1e800 nid=0x1de06 r
    pid=122373 "container-0" #15 prio=5 os_prio=0 tid=0x00007f3c752d5800 nid=0x1de05 waiting on condition [0x00007f
    pid=122372 "Catalina-utility-2" #14 prio=1 os_prio=0 tid=0x00007f3c08406800 nid=0x1de04 waiting on condition [0
    pid=122371 "Catalina-utility-1" #13 prio=1 os_prio=0 tid=0x00007f3c74cf5800 nid=0x1de03 waiting on condition [0
    pid=122367 "Service Thread" #9 daemon prio=9 os_prio=0 tid=0x00007f3c7422c000 nid=0x1ddff runnable [0x000000000
    pid=122366 "C1 CompilerThread3" #8 daemon prio=9 os_prio=0 tid=0x00007f3c7420f000 nid=0x1ddfe waiting on condit
    pid=122365 "C2 CompilerThread2" #7 daemon prio=9 os_prio=0 tid=0x00007f3c7420c800 nid=0x1ddfd waiting on condit
    pid=122364 "C2 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f3c7420b000 nid=0x1ddfc waiting on condit
    pid=122363 "C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f3c74208000 nid=0x1ddfb waiting on condit
    pid=122362 "Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007f3c74206800 nid=0x1ddfa runnable [0x000000
    pid=122361 "Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f3c741d3800 nid=0x1ddf9 in Object.wait() [0x00007f
    pid=122360 "Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f3c741d0800 nid=0x1ddf8 in Object.wait() 
    pid=122359 "VM Thread" os_prio=0 tid=0x00007f3c741c7000 nid=0x1ddf7 runnable 
    pid=122351 "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f3c7401e800 nid=0x1ddef runnable 
    pid=122352 "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f3c74020000 nid=0x1ddf0 runnable 
    pid=122353 "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f3c74022000 nid=0x1ddf1 runnable 
    pid=122354 "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f3c74024000 nid=0x1ddf2 runnable 
    pid=122355 "GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00007f3c74025800 nid=0x1ddf3 runnable 
    pid=122356 "GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00007f3c74027800 nid=0x1ddf4 runnable 
    pid=122357 "GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00007f3c74029800 nid=0x1ddf5 runnable 
    pid=122358 "GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00007f3c7402b000 nid=0x1ddf6 runnable 
    pid=122368 "VM Periodic Task Thread" os_prio=0 tid=0x00007f3c74239000 nid=0x1de00 waiting on condition

     附java代码

    package com.example.demo.threadmanage;
    
    import com.example.demo.threadmanage.scheduler.NamedThreadFactory;
    import org.springframework.stereotype.Service;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Random;
    import java.util.concurrent.*;
    
    /**
     * Created by Administrator on 2020/2/5.
     */
    @Service
    public class ExecutorsTest {
        public static void main(String[] args) {
            ExecutorsTest.threadPoolTest();
        }
        public static void threadPoolTest() {
            /**
             * 创建一个可缓存的线程池
             * 线程池为无限大,当执行当前任务时上一个任务已经完成,会复用执行上一个任务的线程,而不用每次新建线程
             */
            ExecutorService cachedThreadPool= Executors.newCachedThreadPool();
            //executeThreadPool(cachedThreadPool);
    
            /**
             * 创建一个可重用固定个数的线程池
             *因为线程池大小为3,每个任务输出打印结果后sleep 2秒,所以每两秒打印3个结果。
             *定长线程池的大小最好根据系统资源进行设置
             */
            ExecutorService fixedThreadPool=Executors.newFixedThreadPool(3,new NamedThreadFactory("FixedThreadPool"));
            executeThreadPool(fixedThreadPool);
    
            /**
             * 创建一个定长线程池,支持定时及周期性任务执行----延迟执行
             */
            ScheduledExecutorService scheduledThreadPool=Executors.newScheduledThreadPool(5,new NamedThreadFactory("ScheduledThreadPool"));
    //        scheduledThreadPool.schedule(()->{
    //            System.out.println("延迟2秒执行");
    //        },2, TimeUnit.SECONDS);
            scheduledThreadPool.scheduleAtFixedRate(()->{
                System.out.println("延迟2秒后,每3秒执行一次"+getNowTime()+" 线程名称:"+Thread.currentThread().getName());
            },2,3, TimeUnit.SECONDS);
    
            /**
             * 创建一个单线程化的线程池
             *创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,
             * 保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
             */
            ExecutorService singleThreadExecutor=Executors.newSingleThreadExecutor();
    //        executeThreadPool(singleThreadExecutor);
    
            /**
             * 自定义线程池ThreadPoolExecutor
             */
            //创建数组型缓冲等待队列
            BlockingQueue<Runnable> bq = new ArrayBlockingQueue<>(10);
            ThreadPoolExecutor tpe=new ThreadPoolExecutor(3,6,50,TimeUnit.SECONDS,bq,new NamedThreadFactory("CustomizedThreadPool"));
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
            tpe.execute(new TempThread());
    
    //        tpe.shutdown();
        }
    
        public static String getNowTime(){
            SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
            return df.format(new Date());
        }
        public static void executeThreadPool(ExecutorService executorService){
            for (int i = 0; i < 10; i++) {
                System.out.println("thread order is =="+i);
                try{
                    //sleep可明显看到使用的是线程池里面以前的线程,没有创建新线程
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
    
                executorService.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"正在被执行");
                });
    
            }
        }
    }
    
    class TempThread implements Runnable{
        @Override
        public void run() {
            try{
                //sleep可明显看到使用的是线程池里面以前的线程,没有创建新线程
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
    
            System.out.println(Thread.currentThread().getName()+"正在被执行 "+ExecutorsTest.getNowTime());
    
        }
    }

    线程工厂

    package com.example.demo.threadmanage.scheduler;
    
    import java.util.concurrent.ThreadFactory;
    import java.util.concurrent.atomic.AtomicInteger;
    
    /**
     * Created by Administrator on 2020/2/8.
     */
    public class NamedThreadFactory implements ThreadFactory {
        private  final AtomicInteger poolNumber = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;
    
        public NamedThreadFactory(String name) {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                    Thread.currentThread().getThreadGroup();
            if(null==name || "".equals(name.trim())){
                name="pool";
            }
            namePrefix = name+"-" +
                    poolNumber.getAndIncrement() +
                    "-thread-";
        }
    
        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r,
                    namePrefix + threadNumber.getAndIncrement(),
                    0);
            if (t.isDaemon())
                t.setDaemon(false);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
    }
  • 相关阅读:
    最长公共子序列
    最长重复子串—后缀数组
    最长递增子序列
    最长重复子串(转)
    最长递增子序列(转)
    最长不重复子串(转)
    连续子数组最大和(转)
    alert 与 console.log
    一个null,让浏览器SB
    javascript实现简单的动画功能
  • 原文地址:https://www.cnblogs.com/pu20065226/p/12284554.html
Copyright © 2011-2022 走看看