2.4.1-线程的基础知识

优质
小牛编辑
131浏览
2023-12-01

1.1 实现方法

实现方法使用方法示例
继承 Thread 的方法,重写 run 方法。调用 start 方法。
调用线程池 execute 方法。
实现 Runnable 接口,实现 run 方法。构造 Thread 类并新建 Thread 对象,调用 Thread 对象的 start 方法。
调用线程池 execute 方法。
调用 submit 方法提交。
构造 FutureTask 对象,使用 submit 方法提交。
实现 Callable 接口,实现 call 方法。调用 submit 方法提交。
构造 FutureTask 对象,使用 submit 方法提交。

1.2 Future & FutureTask

方法功能
cancel取消任务
isDone判断任务是否完成
isCancelled是否成功取消
get获取任务返回值,该方法会阻塞知道获取到结果。
get(long timeout, TimeUnit unit)

FutureTask 实现 RunnableFuture 接口,RunnableFuture 继承了 Future 和 Runnable 接口。

public class FutureExample {
    public static class MyCallable implements Callable<String>{

        @Override
        public String call() throws Exception {
            System.out.println("Do Something in Thread");
            Thread.sleep(5000);
            return "Done";
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService service= Executors.newCachedThreadPool();
        Future<String> future=service.submit(new MyCallable());
        System.out.println("Do Something in Main");
        System.out.println("Result:"+future.get());
    }
}
public class FutureTaskExample {
    public static class MyCallable implements Callable<String> {

        @Override
        public String call() throws Exception {
            System.out.println("Do Something in Thread");
            Thread.sleep(5000);
            return "Done";
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> task=new FutureTask<String>(new MyCallable());
        new Thread(task).start();
        System.out.println("Do Something in Main");
        System.out.println("Result:"+task.get());
    }
}

2. 线程的基本信息

方法功能
isAlive()线程是否还未终止。
getPriority获取线程优先级。
setPriority设置线程优先级。
getName获取线程名。
setName设置线程名。
currentThread()静态方法,获取当前线程对象。

2. 线程的状态和转换方法

2.1 线程的状态

状态解释
New调用 new Thread() 方法后进入 New 状态。
Runnable(就绪状态)调用 .start()方法 New 状态转为 Runnable 状态,锁池状态获得锁 转为 Runnable 状态。
Running(运行状态)Runnable 获得时间片,转为 Running 状态。
Blocked(阻塞状态)包括Waiting,Waiting(time),同步阻塞。
Waiting等待阻塞,本线程使用的对象被其他线程调用 o.wait() 方法,线程由 Running 状态转为 Waiting 状态,当 o.notifyAll() 被调用时,转为 Runnable 状态。
Waiting(time)调用 wait(time) 后由 Running转为 Waiting(time) 状态。
同步阻塞等待锁。

2.2 状态转换方法

方法功能
join()见名知意,加入,Thread 对象的成员方法。
yield()给其他同优先级和高优先级线程让路,Thread 类的静态方法。
wait()等待让出锁。
sleep()等待不让锁。

3. 线程池的实现

3.1 ThreadPoolExecutor(ExcutorService 的基类) 的构造参数

参数概念
corePoolSize线程池中的线程数量小于该值时,创建线程执行任务,而不会使用空闲线程。
maxPoolSize最大线程数。
keepAliveTime线程没有任务执行时最多保持多久的时间终止。
unit时间的单位。
workQueue阻塞队列,存储等待执行的任务。线程数大于等于 corePoolSize 小于 maxPoolSize 时,该队列未满则将线程放入该队列,满则床创建新线程;如果线程数量大于 maxPoolSize ,且 workQueue 满,使用拒绝策略,有界队列和无界队列。
threadFactory线程工厂,提交后 submit 的方法不执行。
rejectHandler线程被拒绝时调用的方法。
public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

3.2 新建线程池对象

方法功能
ExcutorsnewFixedThreadPool
ExcutorsnewCachedThreadPool
ExcutorsnewScheduledThreadPool
ExcutorsnewSingleThreadPool

3.3 ThreadPoolExecutor 常用方法

接口方法功能
ThreadPoolExecutorgetTaskCount线程池中已执行和未执行的线程总数。
ThreadPoolExecutorgetCompletedTaskCount线程池中已执行,等于结果 1 减去队列中的线程个数。
ThreadPoolExecutorgetPoolSize线程池中现有的线程数。
ThreadPoolExecutorgetActiveCount线程池中正在执行任务的线程数量。
ExecutorServiceshutdown等待提交的任务执行完。
ExecutorServiceList shutdownNow()不等待任务执行完。
Executorvoid execute(Runnable command)参数实现 Runnable 接口,无返回值。
AbstractExecutorServiceFuture submit(Callable task)参数实现 Callable 接口,返回值类型为 T。
AbstractExecutorServiceFuture submit(Runnable task, T result)
AbstractExecutorServiceFuture<?> submit(Runnable task)

4. 线程同步

4.1 CyclicBarrier

4.1.1 功能

CyclicBarrier:某个线程运行到某个之后,该线程停止运行,直到所有的线程都达到这个点,所有线程才能重新运行。线程互相等待,直到准备就绪。如果调用 c.await() 的次数小于 n,线程卡死?

4.1.2 使用步骤

  • 主线程调用 new CyclicBarrier(n) 方法创建 CyclicBarrier 对象;
  • 构造线程时,将 CyclicBarrier 对象传入。
  • 子线程调用 await() 方法,当第 n 个线程调用 await() 方法,所有线程继续执行。

4.2 CountDownLatch

4.2.2 使用步骤

  • 主线程调用 new CountDownLatch(n) 方法创建 CountDownLatch 对象。
  • 构造线程时,将 CountDownLatch 对象传入。
  • 控制主线程调用 await() 方法等待所有子线程完成。
  • 在子线程完成任务,调用 countDown() 方法,当 countDown() 方法调用测试等于 n 时,主线程继续执行。

4.3 信号量(Semaphore)

4.3.1 功能

控制同时放行的进程数。

4.3.2 使用步骤

  • 主函数使用 Semaphore(int permits,boolean fair) 构造信号量对象,permits 为线程数目,fair 表示是否启用先进先出的原则进行公平调度。
  • 构造线程时,将 Semaphore 对象传入。
  • 线程执行前,调用 acquire() 方法获得许可,如果可用许可数大于 0,继续执行,否则阻塞等待。线程可调用 semaphore.availablePermits() 方法查看可用许可证数目。
  • 线程执行完任务后,调用 semaphore.release() 方法释放许可。

4.5 BlockingQueue

4.6 AQS

原理

AQS.PNG

参考资料