Java并发-线程基础

时间:2020-07-01 09:56:43   收藏:0   阅读:50

Java并发-线程基础

线程状态转移

技术图片

线程状态:

新建

创建后未启动.

可运行

阻塞

等待获取排它锁.

无期限等待

进入 退出
无参Object.wait() Object.notify()/Object.notifyAll()
无参Thread.join() 被调用程序结束
LockSupport.park()

期限等待

进入 退出
Thread.sleep()方法 时间结束
Object.wait(int time) 时间结束/Object.notify()/Object.notifyAll()
Thread.join(int time) 时间结束/被调用线程完成
LockSupport.parkNanos()
LockSupport.parkUntil()

死亡

线程结束任务或产生异常终止.


线程的创建

方式:

注:
RunnableCallable是创建一个可以在线程中运行的任务,最终线程的创建还是通过Thread来实现.

实现Runnable接口

实现Callable接口

继承Thread类

实现接口与继承Thread


基础线程机制

Executor

管理多个异步任务的执行,无需显式管理线程的生命周期。

分类:

CachedThreadPool

ExecutorService es = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
    es.execute(()->{
        System.out. println("This is "+Thread.currentThread().getName());
    });
}
Thread.sleep(2000);
es.shutdown();

Daemon

sleep()

yield()


线程中断

InterruptedException

interrupted()

Executor的中断操作


线程互斥同步

两种锁机制控制多线程对共享资源的互斥访问:

synchronized

同步一个代码块

// 多线程访问同一对象时控制其互斥访问
// 若为不同对象时,则多线程互不影响
public void func() {
    synchronized (this) {
        // 共享变量访问代码
    }
}

// 同一对象,互斥访问
Thread t1 = new Thread(()->{func()});
Thread t2 = new Thread(()->{func()});

// 不同对象,互不影响
Object o1 = new Object();
Object o2 = new Object();
Thread t1 = new Thread(()->{o1.func()});
Thread t2 = new Thread(()->{o2.func()});

同步一个方法

// 同一对象,多线程互斥访问
// 不同对象,多线程互不影响
public synchronized void func () {
    // 共享变量访问代码
}

同步一个类

// 作用于整个类
// 无论是否是同一个对象,同一个类的对象都互斥访问
public void func() {
    synchronized (Test.class) {
        // 共享变量访问代码
    }
}

// 同样是作用于整个类
public synchronized static void fun() {
    // 共享变量访问代码
}

ReentrantLock

示例:

private Lock lock = new ReentrantLock();

public void func() {
    lock.lock(); // 获得锁
    try {
        // 共享变量访问代码
    } finally {
        lock.unlock(); // 释放锁,避免发生死锁。
    }
}

对比

实现

性能

大致相当。

等待可中断

公平锁

公平锁:多个线程等待同一个锁时,按照申请的先后顺序获得锁。

绑定条件

一个ReentrantLock可以绑定多个Condition对象。


线程间的协作

join()

wait(),notify(),notifyAll()

await(),signal(),signalAll()

参考:

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!