什么是线程、进程、java虚拟机
进程是系统进行资源分配(内存空间和文件句柄)的最小单位,线程是系统可执行的最小单位。
执行一个程序的过程就是一个进程(计算机任务),,线程是进程中的一小段,多个线程可以共享进程的资源。
Jvm是Java virtual machine,它是用来模拟计算机功能的,作用是屏蔽了不同计算机硬件以及平台的差异,通过调用jvm执行java程序后编译产生class文件,使不同的计算机和平台(只要拥有jvm)就可以直接运行其他平台产生的javaclass文件,实现一次编译,多平台执行。
如何创建线程
Thread.run()源码:
Public void run(){
If (target != null){
Target.run();
}
}
创建Thread对象有两种方法,通过Thread类的Thread() 和 Thread(Runable target) 方法:
①Thread() 方法是通过创建一个继承 Thread类的 class,该class里面重载了Thread里面的run方法。然后使用该类classname objectname = new classname()创建一个线程对象。(继承方式inheritance)
②新建一个class实现Runable接口,里面实现Runnable接口的run方法,最后是使用Thread objectname = new Thread( new class() ) 创建一个线程。(组合composition方式)
组合方式比继承方式耦合性更低。
线程如何启动
在java程序中实现多线程功能是通过Thread类来实现的。
运行一个线程实际上就是使用jvm执行thread对象的run方法,其中run方法是线程的线程体,也就是线程的任务执行逻辑,当run方法执行完,线程就会结束,线程分配的资源就会等待jvm的垃圾回收机制回收。
在thread对象调用start()方法后,线程进入到就绪状态,等待线程调度器(sheduler)为它分配时间片,之后等待当前线程执行完后才会执行,甚至也永远不会运行。
线程的属性
①ID这个是JVM自动分配的,当线程结束被回收后这个ID值可以被赋予之后的线程。
②Name线程的名称(面向开发人员)可以通过setName()和getName()进行设置,
Daemon boolean变量,是设置是否是守护线程,true是代表守护线程,false代表用户线程,默认与父线程一致,可以通过setDaemon()和getDaemon()进行设置。
③priority线程的优先级,在线程启动start()前可以通过setPriority()进行设置,默认优先级与父线程一致。
线程的方法
①static Thread.currentThread()返回当前执行线程对象
②void run() 执行的任务逻辑
③void start()使线程进入就绪状态
④void join()假如A线程调用了B线程的join()方法,则A线程暂停等待B线程执行完后再执行
⑤static yield()释放线程对cpu的占用,可能会使线程暂停,有可能会继续执行
⑥static sleep()使线程停止一段时间之后再执行
线程状态: