天增的博客
首页
博客
  • 分布式解决方案
  • Java并发工具包
  • redis
  • LeetCode
  • 系统设计
  • JVM体系
Github (opens new window)
Rss (opens new window)
  • zh-CN
  • en-US
首页
博客
  • 分布式解决方案
  • Java并发工具包
  • redis
  • LeetCode
  • 系统设计
  • JVM体系
Github (opens new window)
Rss (opens new window)
  • zh-CN
  • en-US
  • Java并发工具包
  • 并发基础
    • 线程基础
      • Thread的状态
      • 进程与线程
      • 正确停止线程的方式
      • Thread的实现方式
        • 实现Runable接口
        • 直接继承Thread
        • 用线程池创建线程
        • 使用Callable方式创建
        • 使用Timer
        • 本质?
      • waitnotifynotifyAll
      • 生产者消费者模型
    • 线程安全
      • 线程不安全
      • 线程安全
      • 需要注意线程安全问题的情况
  • 并发工具
    • 线程协作
      • Semaphore信号量
      • CountDownLatch详解
      • 使用CompletableFuture解决旅游平台问题
      • 使用CyclicBarrier解决团建问题
    • Future
      • Future主要功能
      • FutureTask源码分析
    • ThreadLocal
      • ThreadLocal内存泄漏
      • ThreadLocal使用场景
    • 原子类
      • 原子类的作用概览
      • 原子类的性能分析
    • 阻塞队列
      • 常见的阻塞队列
      • 阻塞队列的常用方法
      • 什么是阻塞队列
    • 并发容器
      • HashMap
      • CopyOnWriteArrayList
      • ConcurrentHashMap详解
    • 线程池
      • 为什么多线程会带来性能问题
      • 线程池的优势
      • 创建线程池的参数
        • 如何设置线程数
      • 线程池线程复用原理
      • ForkJoin框架
    • 各种锁
      • 锁的种类和特点
        • 公平锁非公平锁
        • 自旋锁非自旋锁
        • 共享锁独占锁
        • 乐观锁和悲观锁
      • JVM锁优化
      • synchronized和Lock的对比
      • lock的常用方法
  • 底层原理
    • CAS原理
    • AQS框架
    • 伪共享
    • java内存模型
      • Java内存模型介绍
      • happens-before规则
  • topic
  • Java并发工具包
  • 并发基础
  • 线程基础
  • Thread的实现方式
2022-04-21
目录

Thread的实现方式

# Thread的实现方式

# 实现Runable接口

  • 实现Runable接口
  • 实现run方法
  • 然后通过实现了Runable的实例传递到Thread中,就能实现线程
public RunableThread implements Runable {
  @Override
  public void run(){
    System.out.println("实现Runable接口来实现线程");
  }
}

# 直接继承Thread

public ExtentsThread extend Threaad {
	 @Override
  public void run(){
    System.out.println("用Thread类实现线程");
  }
}

# 用线程池创建线程

会给我们线程创建设置一些默认的值,比如名字,是不是守护线程,以及优先级

private static class DefaultThreadFactory implements ThreadFactory {
    ....
    ....
    DefaultThreadFactory() {
        SecurityManager s = System.getSecurityManager();
        group = (s != null) ? s.getThreadGroup() :
                              Thread.currentThread().getThreadGroup();
        namePrefix = "pool-" +
                      poolNumber.getAndIncrement() +
                     "-thread-";
    }

    public Thread newThread(Runnable r) {
        Thread t = new Thread(group, r,
                              namePrefix + threadNumber.getAndIncrement(),
                              0);
        if (t.isDaemon())
            t.setDaemon(false);
        if (t.getPriority() != Thread.NORM_PRIORITY)
            t.setPriority(Thread.NORM_PRIORITY);
        return t;
    }
}

# 使用Callable方式创建

有返回值的callable也是新建线程的一种方式。

		public class CallableTask implements Callable<Integer> {
      	@Override
       	public Integer call() throw Exception {
          	return new Random().nextInt();
        }
    }

# 使用Timer

TimerTask实现了Runable的接口,Timer中有个TimerThread继承了Thread,本质他还是Thread

# 本质?

Thread的实现的方式从本质上来看只有一种。

来看下Thread的run是如何实现的。

    .......
		private Runnable target;		
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
		.....
  • 方式1: 最终调用target.run() 方法

  • 方式2: 整个run方法被重写

    因此,创建线程只有一种方法:构造Thread类

实现方式有两种:

  1. 使用Runable的方式,最后调用target.run方法进行启动
  2. 直接继承Thread类,重写run方法
最近更新
01
以 root 身份启动 transmission-daemon
12-13
02
Debian系统安装qbittorrent-nox
12-09
03
LXC Debain12安装zerotier并实现局域网自动nat转发
07-29
更多文章>
Theme by Vdoing | Copyright © 2015-2024 天增 | 苏ICP备16037388号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式