Java 线程(一):什么是线程
2018-03-06 09:59
183 查看
一、基本概念 如果要解释线程,就必须明白什么是进程。
进程是指一个内存中运行的应用程序,每个进程都有自己独立的地址空间(内存空间),一个进程中可以启动多个线程。比如在Windows系统中,运行一个exe就是一个进程。 线程是指进程中的一个执行流程,一个进程可以运行多个线程。比如java.exe进程可以运行很多线程。线程总是存在于某个进程,线程自己不拥有系统资源,但同一进程中的多个线程可以共享进程所拥有的全部资源(内存)。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。线程有新建、就绪、运行、阻塞和死亡五种基本状态。 Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。
一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出 。 对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。 Java中线程是指java.lang.Thread类的一个实例或线程的执行。使用java.lang.Thread或java.lang.Runnable接口编写代码定义、实例化、启动新线程。 Java中每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行。main()方法运行在一个线程内,称为主线程。一旦创建一个新的线程,就产生一个新的调用栈。 线程分为两类:用户线程和守候线程。当所有用户线程执行完毕后,JVM自动关闭。但是守候线程却不独立与JVM,守候线程一般是有操作系统或用户自己创建的。
进程是指一个内存中运行的应用程序,每个进程都有自己独立的地址空间(内存空间),一个进程中可以启动多个线程。比如在Windows系统中,运行一个exe就是一个进程。 线程是指进程中的一个执行流程,一个进程可以运行多个线程。比如java.exe进程可以运行很多线程。线程总是存在于某个进程,线程自己不拥有系统资源,但同一进程中的多个线程可以共享进程所拥有的全部资源(内存)。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。线程有新建、就绪、运行、阻塞和死亡五种基本状态。 Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。
一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出 。 对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。 Java中线程是指java.lang.Thread类的一个实例或线程的执行。使用java.lang.Thread或java.lang.Runnable接口编写代码定义、实例化、启动新线程。 Java中每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行。main()方法运行在一个线程内,称为主线程。一旦创建一个新的线程,就产生一个新的调用栈。 线程分为两类:用户线程和守候线程。当所有用户线程执行完毕后,JVM自动关闭。但是守候线程却不独立与JVM,守候线程一般是有操作系统或用户自己创建的。
二、定义线程
继承java.lang.Thread类:在子类中重写run()方法,方法里的内容就是线程所要执行的任务。 实现java.lang.Runnable接口:在实现类中重写run()方法,创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象。三、实例化线程
如果是继承了java.lang.Thread类的线程,则直接调用new即可。 如果是实现了jav.lang.Runnable接口的类,则调用Thread的构造方法: Thread(Runnable target) Thread(Runnable target,String name) Thread(ThreadGroup group, Runnable target) Thread(ThreadGroup group, Runnable target, String name) Thread(ThreadGroup group, Runnable target, String name, long stackSize)四、启动线程
在线程的Thread对象上调用start()方法,而不是run()或别的方法。 在调用start()方法之前,线程处于新状态中,新状态有一个Thread对象,但没有一个真正的线程。 在调用start()方法之后,发生了一系列复杂的事情: 启动新的执行线程(具有新的调用栈); 该线程从新状态转移到可运行状态; 当该线程获得执行机会时,其目标run()方法将运行。五、注意事项
获取当前线程的对象的方法是:Thread.currentThread(); 当线程目标run()方法结束时该线程完成。 一旦线程启动,它就永远不能再重新启动。只有一个新的线程可以被启动,并且只能一次。一个可运行的线程或死线程可以被重新启动。 线程的调度是JVM的一部分,在一个CPU的机器上上,实际上一次只能运行一个线程。一次只有一个线程栈执行。JVM线程调度程序决定实际运行哪个处于可运行状态的线程。众多可运行线程中的某一个会被选中做为当前线程。可运行线程被选择运行的顺序是没有保障的。 尽管通常采用队列形式,但这是没有保障的。队列形式是指当一个线程完成“一轮”时,它移到可运行队列的尾部等待,直到它最终排队到该队列的前端为止,它才能被再次选中。事实上,我们把它称为可运行池而不是一个可运行队列,目的是帮助认识线程并不都是以某种有保障的顺序排列一个队列的事实。 尽管我们没有无法控制线程调度程序,但可以通过别的方式来影响线程调度的方式。相关文章推荐
- java中精灵线程(Daemon)或守护线程和普通线程有什么区别
- 在JAVA中线程到底起到什么作用!
- 什么是java的守护线程
- Java守护线程-没什么意义
- 【Java多线程】什么是线程与线程的生命周期与线程的创建方式
- 什么是线程 Java与Android
- java 中有几种方法可以实现一个线程? 用什么关键字修 饰同步方法? stop()和 suspend()方法为何不推荐使用?
- java开发线程篇2:sleep() 和 wait() 有什么区别? (做线程的必知!)
- 关于java中多线程的问题的一点思考(什么情况下需要考虑到线程,以及线程安全的问题?)
- java中有几种方法可以实现一个线程?用什么关键字修饰同步方法 stop()和suspend()方法为何不推荐使用?
- Java线程:什么是线程
- 什么是java 的守护线程
- 什么是java的守护线程
- Java - Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
- 在JAVA中线程到底起到什么作用
- Java中有几种方法实现一个线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不提倡使用?
- java有几种方法可以实现一个线程?用什么关键字修饰同步方法?
- java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器
- 在JAVA中线程到底起到什么作用!
- Java线程状态中BLOCKED和WAITING有什么差别?