线程和进程区别

线程的基本概念:

进程:

一个程序是一个进程的概念,进程相对于程序来说就是动态的概念。例如点击qq启动,可以说开启一个进程

进程是程序运行和资源分配的基本单位。一个程序至少有一个进程,一个进程至少有一个线程

线程:

一个进程的不用执行路径,作为进程里面最小的执行单元,线程是CPU调度和分配的基本单位,是比程序更小的能独立运行的基本单位,同一进程的多个线程之间可以并发执行。每个线程拥有自己的计数器,堆栈,局部变量等属性。

程序的例子:
package com.example.userapi.juc;/*
 *@author wupeng
 *@time 2021/6/30-21:46

 */

import java.util.concurrent.TimeUnit;

public class T01_WhatIsThread {
    private static class T1 extends Thread {
        @Override
        public void run() {
            for(int i = 0;i<10;i++) {
                try {
                    TimeUnit.MICROSECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("T1");
            }
        }
    }

    public static void main(String[] args) {
        new T1().start();
//        new T1().run(); //说明线程没有启动。其实就是简单的方法调用
        for (int i = 0;i<10;i++) {
            try {
                TimeUnit.MICROSECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("main");
        }
    }
}
//以上结果出现交替输出,也就是说程序中有两条不同的执行路径在交叉执行。

使用JMX查看普通Java程序包含哪些线程?

package juc_1;/*
 *@author wupeng
 *@time 2021/7/14-8:33

 */

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;

public class MultiThread {
    public static void main(String[] args) {
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false,false);
        for (ThreadInfo threadInfo:threadInfos) {
            System.out.println("["+threadInfo.getThreadId()+"]"+threadInfo.getThreadName());
        }
    }
}
创建线程的两种方式:
package com.example.userapi.juc;/*
 *@author wupeng
 *@time 2021/6/30-21:52
创建线程常见的有两种方式
继承Thread
实现Runnable接口  new Thread 传入Runable对象
 */

public class T02_HowToCreatThread  {
    static class MyThread extends Thread {
        @Override
        public void run() {
            try {
                sleep(100);
                System.out.println("Hello MyThread");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    static class MyRun implements Runnable {
        @Override
        public void run() {
            System.out.println("Hello MyRun!");
        }
    }

    public static void main(String[] args) {
        new MyThread().start();
        new Thread(new MyRun()).start();
        new Thread(() ->{
            System.out.println("Hello Lambda");
        }).start();
    }
}


线程run方法和start方法的区别

方法run称为线程体,通过start()方法启动一个线程。

run本质是一个函数,

创建线程的方式:

面试:请你告诉我启动线程的三种方式?

1.new Thread().start

2.new Thread(Runnable).start()

3.Executors.newCachedThreadpool()或者FutureTask+Callable通过线程池启动
posted @ 2021-07-14 10:20  IT小五  阅读(94)  评论(0)    收藏  举报