进程其实就是一个应用程序,列如迅雷就是一个进程,多个下载任务就是多个线程。一个进程包含多个线程。
在系统中要执行某个进程主要看能不能获取到cpu的资源,也就是cpu的时间片,这个是无法控制的,cpu给每个进程一定的执行时间,时间到就到下一个进程。
线程的生命周期:
java中实现线程的方式有两种:
1.继承Thread类。
继承Thread类后需要重写run方法,然后再run方法中写需要执行的代码。可以通过Thread实现类也就是ThreadTest类的有参构造方法来给线程命名,或者通过getName获取线程名字。
实际上java程序在运行时会启动两个线程,一个是主线程,一个是垃圾回收线程,可以使用setName方法设置线程的名字,调用start方法即可开启一个线程。
也可以调用Thread.currentThread方法设置当前线程的名字,也就是主线程的名字。
2.实现runnable接口。
实现runnable接口也要重写run方法,同样的可以调用Thread.currentThread.getName获取当前线程的名字。
继续Thread类和实现Runnable接口的区别:
1.因为java中是单继承,所以继承Thread类就无法再继承其他类。
2.虽然都是run方法,但是两个run方法是不同的,继承Thread类的run方法是写在继承Thread类的子类中,实现接口的run方法是写在Runnable接口的实现类的run方法中。
3.实现Runnable接口的方式适合多个线程去处理同一个资源,
继承类如果要开启多线程需要实例化类两次,就会引起资源的不统一,比如卖票就会出现一个线程卖100,总共就会卖出200张票,但是也可以通过加static关键字解决。实现接口就不会出现这种情况,因为只用实例化一次类。
3.线程优先级问题:
线程优先级默认是5,有1,5,10,但是只是概率并不是一定的。