ali-java-多线程

  1. 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方法有自己的实现

  1. 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实例这一个资源
    就是多线程开发。

  1. callable

 和runable一样都是需要Thread.start启动运行,callable是可以返回的,FutureTask也是实现了runable方法。里面调用了callable的call方法

task.get()方法就是在等在结果,awaitDone for循环等待结果执行完成,report 则将返回outcome将结果返回。

 

  1. 线程的运行状态

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 讲计算后的副本同步到主内存中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值