1.进程|线程
进程是系统分配和管理的资源的基本单位。 进程就是在系统中运行的程序或者任务,比如在任务管理器中,你看到的每一个正在运行的exe程序就可以理解成 一个进程。 -------------------------------- 在IDE中运行*.class文件相当于在操作系统中启动一个JVM虚拟机进程,在该虚拟机进程加载*.class文件并运 行。 -------------------------------- 线程是在进程中独立运行的子任务。 进程和线程总结: 1.进程虽然是相互独立的,但它们可以互相通信,通用的方式是使用Socket或HTTP协议。 2.进程拥有共享的系统资源,比如内存、网络端口、供其内部线程使用。 3.进程较重、因为创建进程需要操作系统分配资源,会占用内存。 4.线程存在于进程中,是进程的一个子集,先有进程、后有线程。 5.虽然线程更轻,但线程上下文切换的时间成本非常高。
2.使用多线程的优点
充分利用CPU的空闲时间来处理其他任务,由于任务的切换速度很快,给使用者的感受就是这些任务同时运行,所 以使用多线程技术可以在同一时间内做更多不同种类的任务。 --------------------------------- 补充: 1.单任务的特点就是排队执行,也就是同步。在同一时间只能执行一个任务,CPU利用率大幅降低,这就是单任务环境的缺点。 2.多任务的特点是在同一时间内可以执行多个任务,使用多线程就是在使用异步。
3.在什么场景使用多线程
1.阻塞:系统中出现了阻塞现象,则可以根据实际情况来使用多线程提高运行效率。 2.依赖:业务A阻塞时,业务B不依赖业务A的执行结果时,可以用多线程提高运行效率。
4.继承Thread类
Java的JDK开发包自带了对多线程技术的支持,可以方便地进行多线程编程。实现多线程编程的方式主要有两种: 一种是继承Thread类,另外一种是实现Runnable接口。这两种方式创建线程的功能都是一样的,没有本质的区 别。只不过继承的局限就是单继承,实现可以多实现。
public class ThreadTest {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
System.out.println("运行结束!");
}
}
------------------------------------
public class MyThread extends Thread{
@Override
public void run() {
System.out.println("MyThread");
}
}
------------------------------------
输出:
运行结束!
MyThread
Process finished with exit code 0
代码使用start()方法来启动一个线程,线程启动后会自动调用线程对象中的run()方法,run()方法里面的代码
就是线程对象要执行的任务,是线程执行任务的入口。
注意:
使用多线程技术时,代码的运行结果与代码执行顺序或调用顺序无关。因为线程是一个子任务,CPU是以不确定的
方式,或者随机的时间来调用线程中的run()方法,所以先输出"运行结束!"和先输出"MyThread"具有不确定性。
5.常见的3个命令分析线程的信息
如果想要查看线程的状态与信息,则可采用3种常见的命令,分别是jsp+jstack.exe、jms.exe和jvisualvm.exe 它们在jdkbin文件夹中。
1.jps+jstack.exe命令,在cmd中输入jps命令查看Java进程,然后使用jstack命令查看该进程下线程的状态: C:Program FilesJavajdk1.8.0_201bin>jps --直接回车 便可以查询进程对应的PID 7088 Launcher 7712 ThreadTest2 4276 Jps 7096 11564 RemoteMavenServer36 C:Program FilesJavajdk1.8.0_201bin>jstack -l 7712 --回车就可以看到线程的状态
2.使用jmc.exe命令 在jdk/bin中双击jmc.exe命令
注意:如果在jmc.exe中看不到JVM进程,说明jmc.exe和IDE中使用的JDK版本不一致。
3.使用jvisualvm.exe命令,双击jvisualvm.exe命令。
6.执行start()的顺序不代表执行run()的顺序
执行start()方法的顺序不代表线程启动的顺序,不代表run()方法执行顺序,执行run()是随机的。
public class ThreadTest3 extends Thread {
private int i = 0;
public ThreadTest3(int i) {
this.i = i;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "---->i" + i);
}
}
public class ThreadTest {
public static void main(String[] args) {
ThreadTest3 t1 = new ThreadTest3(1);
ThreadTest3 t2 = new ThreadTest3(2);
ThreadTest3 t3 = new ThreadTest3(3);
ThreadTest3 t4 = new ThreadTest3(4);
ThreadTest3 t5 = new ThreadTest3(5);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
-------------------------------------------
Thread-2---->i3
Thread-3---->i4
Thread-1---->i2
Thread-4---->i5
Thread-0---->i1
Process finished with exit code 0
7.



