线程和进程区别
线程的基本概念:
进程:
一个程序是一个进程的概念,进程相对于程序来说就是动态的概念。例如点击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通过线程池启动