线程实现的两种方式
1.继承Thread类
Thread类是在java.lang包中定义的。一个类只要继承了Thread类,同时覆盖了本类中的run()方法,则就可以实现多线程的操作了。
通过调用run方法使得线程开始执行,非常的有规律,先执行第一个对象,再执行第二个对象。并么没有实现交互的运行。
这样程序可以交替的运行。一旦调用start()方法,则会通过JVM找到run方法。
Start方法与run方法的区别
1、start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。
通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后JVM通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程执行体,它包含了要执行的这个线程的内容,run方法运行结束,此线程终止,而CPU再运行其它线程。
2、run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。
如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程,只有这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。
记住:线程就是为了更好地利用CPU,提高程序运行速率的!
使用继承Thread类来实现多线程,有一个很大的弊端。一个类只能一个父类。
2.实现Runnable接口
该接口只有一个没有返回值的run()方法。
使用实现Runnable接口的子类并没有定义start方法,只有通过Thread类的构造方法才可以启动多线程。
使用接口的好处:
1.避免了单继承的局限性,一个类可以实现多个接口。
2.适合资源的共享。
但是他们之间还是有联系的:就好像是代理模式。
线程的操作
1.设置和取得名字
设置名字:
public final void setName(String name)
public Thread(Runnable target,String name)
取得名字:
public final String getName()
取得当前线程:
public static Thread currentThread()
在java执行一个java程序最少有多少个线程?
Main gc
2.线程的休眠
public static void sleep (long millis) throws InterruptedException
3.线程的中断
public void interrupt()
4.设置线程的优先级
在多线程的操作中,所有的代码实际上都是存在优先级的,优先级高的就有可能先执行,线程使用:public final void setPrioperity(int newPriority)
对于优先级来说在线程中有如下三种:
最高:public static final int MAX_PRIORITY
中等:public static final int NORM_PRIORITY
最低:public static final int MIN_PRIORITY