-
java多线程
Thread的原理:
private native void start0(); start0 是一个native 方法 ,jvm虚拟机在不同的操作系统上(windows,linux,unix)都是不同的算法来实现的。
A native method is a Java method whose implementation is provided by non-java code
JNI技术Java不在乎Native方法是用什么语言实现的,只要一来语言能和底层打 交道就好了,二来语言实现完可以提供出来.dll/.so文件。因此同一个Native方法,如果不同的Java虚拟机去调用它,那么结果可能都不同,比 如Object的hashCode(),当然,运行效率也不尽然相同,因为不同的虚拟机对于不同的Native方法有自己的实现
-
runnable
java只能支持单继承,runnale是接口可以突破这一局限
- Thread和runable的关系 (Thread类本身 也是实现了runable接口),但是都是通过调用Thread类对象启动多线程 new Thread(runable).start()。
- Thread 的start 和 run方法:start方法因为开启新的线程因此包含了系统资源调度,同时方法内是通过调用run方法,run方法内部也是调用了target.run方法,也就是实现了runable的方法。
run方法只涉及到我们业务处理,所以我们写代码只关注业务代码即可。
- 多线程开发 需要思考理清的问题。我们在开发多线程的时候其实就是资源的抢占访问。我们每实例化Thread对象就是多个线程对象,这多个Thread对象就表示多个线程对象
Runnable接口可以用来表示一个资源,一个Runable接口就是一个资源。例如,Thread(runableA),Thread(runnableA),这是两个Thread线程都是访问runnableA实例这一个资源
就是多线程开发。
-
callable
和runable一样都是需要Thread.start启动运行,callable是可以返回的,FutureTask也是实现了runable方法。里面调用了callable的call方法
task.get()方法就是在等在结果,awaitDone for循环等待结果执行完成,report 则将返回outcome将结果返回。
-
线程的运行状态
1、任何一个线程都是通过Thread封装,调用start启动,进入就绪状态
2、进入就绪状态就等待系统调度,调度成功进入运行状态,但是运行状态不可能一直持续下去,中间会产生暂停状态,例如某个线程执行到一定时间进入阻塞状态,随后会重新回归就绪状态。
3、run方法执行完毕,线程也就结果此时就可以直接进入到终止状态。
常用方法
public static native Thread currentThread();
public static native void sleep(long millis) throws InterruptedException; 需要处理中断异常,另外多个线程话进入到这一段代码块sleep(), 休眠会有先后顺序。
public boolean isInterrupted() public void interrupt() 所有正在执行的线程都是可以被中断的,中断线程必须进行异常处理InterruptedException。
public final void wait() throws InterruptedException 从object类中继承,当前线程会等待,当前线程指的是调用者线程。且当前线程必须持有object对象的监控器。currentThread{ synchronized(object) thisObject.wait()}
public final void join() throws InterruptedException 强制执行内部也是调用了wait,可以在满足某些条件之后,某一线程可独占资源,直到结束。当前线程中调用 霸道.join,那么当前线程需要等待此霸道线程执行完后才能执行。
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) { 这里while循环表示被抢线程就会一直等待霸道线程执行完成
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
public static native void yield(); 礼让
public final void setPriority(int newPriority) 设置优先级,优先级越高越容易执行
Volatile 关键字
主要是定义在属性上的,表示此属性是只在操作主内存的,和同步没有关系。
正常变量操作:
1 获取变量原有的数据内容副本 2 利用副本进行数学计算 3 讲计算后的副本同步到主内存中