java实现多线程

一、同步和异步

1、同步就是A调用B,调用一旦开始,A必须等到B调用返回结果后,才能继续后续的行为。

2、异步就是A调用了B方法但是不需要等待B方法返回的结果,就能继续执行A方法中剩下的内容。

3、线程同步和异步:一个进程启动的若干个不相关进程,他们之间的相互关系为异步;同步必须执行到底后才能执行其他操作,异步可同时执行。
(多个线程在执行的过程中是不是使用同一把锁。如果是,就是同步;否则就是不同步)

4、线程概念

在这里插入图片描述

二、 继承Thread类实现多线程

步骤:
1、 自定义线程类继承Thread类;
2、 重写run()方法,编写线程执行体;
3、 创建线程对象,调用start()开启线程。线程开启不一定立即执行,由CPU调度执行。

// 1、自定义线程类
public Class TestThread extends Thread{
  //2、重写run()方法
    @Override
    public void run(){
      //线程方法体内容
    }
}

public static void main(String[] args){
   //3、创建线程对象
   TestThread  t1 = new TestThread();
   t1.strart();
}

注意:

在这里插入图片描述

三、实现Runnable接口,重写run方法

步骤:
1、定义类实现Runnable接口;
2、重写run()方法,编写线程执行体;
3、创建线程对象,调用start()启动线程;

public Class TestThread implements Runnable{
    @Override
    public void run(){
      //线程方法体内容
    }
}

public static void main(String[] args){
   //创建线程对象
   TestThread  t1 = new TestThread();
   Thread t = new Thread(t1);
   //启动
   t.strart();
}

【对比】:

1、源码角度,Thread实现了Runnable接口,提供了更多的可用方法和成员。
2、无论Thread 和 Runnable 都会new Thread(),然后执行run()方法。

四、实现Callable接口

public Class TestThread implements Callable<Boolean>{
    @Override
    public Boolean call(){
      //线程方法体内容
      return true;
    }
}

public static void main(String[] args){
   //创建线程对象
   TestThread  t1 = new TestThread();
   //创建执行服务
   ExecutorService ser = Executors.newFixedThreadPool(3);
   //提交结果
   Future<Boolean> r1 = ser.submit(t1);
   //获取结果
   boolean rs1 = r1.get();
   //关闭服务
   ser.shutdownNow();
}

优点:
1、可以定义返回值
2、可以抛出异常

五、线程状态

在这里插入图片描述


在这里插入图片描述

六、线程方法

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


七、锁

1、synchronized
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、Lock

在这里插入图片描述

在这里插入图片描述

3、对比

在这里插入图片描述

八、死锁

在这里插入图片描述
在这里插入图片描述

九、线程通信

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

十、线程池

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java是一种面向对象的编程语言,它提供了强大的多线程支持。多线程允许程序同时执行多个任务,从而提高程序的并发性和响应速度。 在Java实现线程主要有以下几种方式: 1. **继承Thread类**:这是最简单的方式,创建一个类继承Thread类,并重写run()方法。当启动这个线程时,会调用这个run()方法。 ```java class MyThread extends Thread { public void run() { // 线程执行的代码 } } // 在其他地方使用这个线程 MyThread thread = new MyThread(); thread.start(); ``` 2. **实现Runnable接口**:这种方式比继承Thread类更灵活,因为Runnable是一个接口,它可以用来封装需要被多个线程调用的对象。创建Runnable对象并实现一个构造函数来接受Thread对象,然后通过该Thread对象启动新线程。 ```java class MyRunnable implements Runnable { public void run() { // 线程执行的代码 } } // 在其他地方使用这个Runnable对象创建新线程 Thread thread = new Thread(new MyRunnable()); thread.start(); ``` 3. **使用Callable和Future**:Callable是一个比Runnable更高级的接口,它允许你指定任务是否成功完成。你可以使用ExecutorService来执行Callable任务,并获取Future对象来查询任务是否完成以及结果。这种方式适合于需要返回结果的任务。 4. **使用线程池**:使用线程池可以更有效地利用系统资源,避免频繁创建和销毁线程带来的开销。Java提供了一个Executor框架,你可以使用它来创建和管理线程池。 5. **并发集合**:Java的并发包(java.util.concurrent)提供了许多并发集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,这些类可以在多线程环境下安全地使用。 6. **Java NIO(New IO)包**:Java NIO包提供了一种更高效的IO模型,通过非阻塞和并行的IO操作,可以实现更高效的并发处理。 7. **CompletableFuture类**:这是Java 8引入的一个新的工具类,用于异步编程和协程。CompletableFuture允许你在多个线程之间安全地传递结果和异常。 以上就是在Java实现线程的一些主要方式。选择哪种方式取决于你的具体需求和场景。一般来说,如果你的任务是简单的IO操作或者不需要返回结果,使用继承Thread或者实现Runnable接口就足够了。如果你的任务更复杂,可能需要使用Callable和Future、线程池、并发集合等更高级的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值