再议java多线程Thread和Runable

JAVA herman 773浏览 0评论

多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。

java实现多线程的两种方式:继承Thread和实现Runable

这两种方式都能实现一个线程,当我们启动一个test线程的的时候,实际上是启动了main和test两个线程。两个线程并行执行,所以 他们执行的顺序是不确定的,取决于谁先获得CPU资源。同时还有一个必定会启动的线程就是垃圾回收线程,程序运行在JVM上,启动线程就是启动程序,JVM需要对它进行资源分配和管理,而java的内存自动管理机制就会启动垃圾回收线程来管理资源。

Thread和Runable的异同

Runable接口:这个接口只有一个抽象方法Run()。

Thread类:由于类里面的东西比较多,需要看的可以打开看下,可以看到Thread实现了Runable接口,其中还拥有许多自己的属性和方法。

eclipse的outline视图

Thread类的属性和方法Thread类的属性和方法

部分属性和方法解读

MIN_PRIORITY: 一个线程可以拥有的最低优先级1
NORM_PRIORITY:分配给线程的默认优先级5
MAX_PRIORITY:一个线程能够拥有的最高优先级10
静态方法:(native方法都是需要VM底层实现的,我们在java源码中看不到具体的实现)
currentThread():返回对当前执行的线程对象的引用。(native方法)
yield():暂停当前正在执行的线程对象,并执行其他线程(native方法)
这个方法的目的是让当前运行线程回到就绪状态(可运行状态)用来让具有相同优先级其他线程可以运行(获得CPU资源),目的是为了同优先级的线程轮转,但实际是无法保证的,因为即使进入了就绪状态,相同的优先级他仍然可能被选择来执行。
sleep():线程休眠,参数指定休眠(暂停)的毫秒数。但是线程不损失任何资源的所有权。(native方法)
start():启动线程,直接让线程进入就绪状态,同时与主线程分开执行,主线程会继续执行后面的方法,二线程则会等待CPU资源,获取CPU资源之后开始运行RUN方法内的内容,RUN方法中包含了线程的需要执行的所有内容,执行完毕,线程结束。
Join(millis):等待millisseconds后这个线程就不再等待(最大等待时间),当millisseconds=0,就是无限等待,直到这个线程执行完毕。(等待调用的是Object的wait方法)
exit():private,私有的方法,这个方法是在Run方法执行结束后用于结束线程的。通过单步调试一个线程发现执行完run方法之后会进入exit方法。
state:枚举类型,线程的状态( NEW, RUNNABLE,BLOCKED,WAITING, TIMED_WAITING,TERMINATED),通过getState()方法可以获取到当前线程的状态。
无论是实现Runable接口还是继承Thread类,最终启动线程的时候我们发现都是调用的start()方法,说明他们最终的都是要通过Thread这个实现类来进行各种操作。通过Runable实现的线程最终还是调用Thread类中的方法和属性。