当前位置: 首页 > 科技观察

看了这篇Java多线程的讲解,思路一下子就明白了……

时间:2023-03-21 18:45:15 科技观察

thread是一个进程中一个独立的控制单元。线程控制进程的执行。一个进程中至少有一个线程。多线程可以更好的利用cpu资源,线程间也可以进行数据共享。在Java中,线程是指进程中的一个执行过程。一个进程可以运行多个线程。Java中的每个线程都有一个调用堆栈。即使程序中没有创建新的线程,也有一个main()方法运行在一个线程中,称为主线程,一旦创建了一个新的线程,就会产生一个新的调用栈。多线程的基本概念线程是指进程中的一个执行场景,也就是执行流程,那么进程和线程有什么区别呢?每个进程都是一个应用程序,有独立的内存空间。进程中的内存和资源(共享内存是堆内存和方法区内存,栈内存不共享,每个线程都有自己的。)什么是进程?一个进程就是一个应用程序。操作系统每次启动一个应用程序,都会相应地启动一个进程。比如:倩倩静听进程,魔兽进程,Word进程,QQ进程,JVM启动对应一个进程。系统引入多进程的功能?最初的计算机是“单进程”,计算机只能运行一个应用程序。例如,第一台计算机只有一个DOS窗口。现代电脑可以满足我们一边听音乐一边玩游戏。现代计算给了我们人类的感觉:多个事物一起运行。感觉是平行的(错觉)。对于单核计算机来说,在某个时间点只能做一件事,但是由于计算机的处理速度很高,所以会在多个进程之间完成频繁的切换执行。这种切换速度让人产生一种错觉。人类的错觉是多个进程同时运行。计算机引入多进程的作用:提高CPU的利用率。关键点:进程与进程之间的内存独立性。什么是线程?线程是进程的执行上下文。一个进程可以启动多个线程。进程中引入多线程的作用?提高进程的利用率。要点:栈内存在线程之间是独立的,堆内存和方法区内存是共享的。一线程一栈。描述一下java程序的执行原理:java命令的执行会启动JVM,而JVM的启动就是启动一个应用程序,也就是启动一个进程。进程自动启动一个“主线程”,主线程负责调用某个类的main方法。所以main方法的执行是在主线程中执行的。然后其他的“分支线程”就可以通过main方法代码的执行来启动了。因此,main方法结束并不一定就结束了程序,因为其他分支线程可能还在执行。线程的创建与启动Java虚拟机的主线程入口是main方法,用户可以自行创建线程。创建方式有两种:继承Thread类实现Runnable接口(推荐使用Runnable接口)继承Thread类。在Thread类中创建线程是最重要的两个方法:publicvoidrun()和publicvoidstart()使用Thread类创建线程。用户只需要继承Thread,重写Thread中的run方法即可。如果父类Thread中的run方法没有抛出异常,那么子类就不能抛出异常,最后使用start启动线程[示例代码],不要使用线程publicclassThreadTest01{publicstaticvoidmain(String[]args){Processorp=newProcessor();p.run();method1();}privatestaticvoidmethod1(){System.out.println("--------method1()");}}classProcessor{publicvoidrun(){for(inti=0;i<10;i++){System.out.println(i);}}}上面的序列输出了相应的结果(属于串行),即在run方法执行完毕后才执行method1方法,即method1必须等待前面的方法返回后才能执行。这是一个“同步编程模型”【代码示例】,使用线程publicclassThreadTest02{publicstaticvoidmain(String[]args){Processorp=newProcessor();//手动调用这个方法//不能使用run来启动一个场景(线程),//run是一个普通的方法调用//p.run();//使用start来启动线程,不是直接调用run//start不是立即执行线程,而是让线程准备好//线程的实际执行是由Java的线程调度机制p.start();//只能启动一次//p.start();method1();}privatestaticvoidmethod1(){System.out.println("--------method1()");}}classProcessorextendsThread{//重写Thread中的run方法,该方法无异常//该方法由java线程丢弃机制调用//我们不应该手动调用这个方法publicvoidrun(){for(inti=0;i<10;i++){System.out.println(i);}}}通过输出结果,你会看到没有执行顺序,但是在输出numbers的同时,执行了method1()方法,从效率的角度来看,多线程的例子更快,因为我们可以看到是同时执行的mthod1()方法不等待前面的操作完成才执行,这叫做“异步编程模型”实现了Runnable接口其实Thread对象本身就实现了Runnable接口,但是一般建议直接使用Runnable接口编写多线程程序,因为接口会比类带来更多好处[示例代码]publicclassThreadTest03{publicstaticvoidmain(String[]args){//Processorr1=newProcessor();Runnabler1=newProcessor();//不能直接调用run//p.run();Threadt1=newThread(r1);//启动线程t1。开始();method1();}privatestaticvoidmethod1(){System.out.println("--------method1()");}}//实现Runnable接口classProcessorimplementsRunnable{//实现Runnable中的run方法publicvoidrun(){for(inti=0;i<10;i++){System.out.println(i);}}}