锁和多线程:线程创建3种方式(代码片段)

linyufeng linyufeng     2023-01-22     133

关键词:

 

 

搞明白 线程 多线程系列

1.线程创建

线程创建常见的三种方式:

  1. 继承Thread类

  2. 实现Runnable接口

  3. 实现Callable接口

第三种方式有异步调用效果,类似js中的ajax可以接收返回值,其余两种不能.

package thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @Author lyf
 * @Date 2018/11/17 0017 13:38
 */
public class MyThread 
  public static void main(String[] args) throws ExecutionException, InterruptedException 
    // 继承Thread类  
    new Thread01("线程1").start();
    // 实现Runnable接口
    new Thread(new Thread02(), "线程2").start();
    // 实现Callable接口
    FutureTask<String> futureTask = new FutureTask<>(new Thread03());
    futureTask.run();
    while (futureTask.isDone())  // 判断线程是否运行结束
      System.out.println("结果: " + futureTask.get());// 获取结果
      return;
    
  



class Thread01 extends Thread 
  public Thread01(String name) 
    super(name);
  

  @Override
  public void run() 
    System.out.println(Thread.currentThread().getName() + "执行...");
  


class Thread02 implements Runnable 

  @Override
  public void run() 
    System.out.println(Thread.currentThread().getName() + "执行...");
  


class Thread03 implements Callable<String> 

  @Override
  public String call() throws Exception 
    Thread.sleep(3000);
    System.out.println(Thread.currentThread().getName() + "执行...");
    return "hello";
  

2.线程安全

多线程下访问数据会有线程安全问题.比如买火车票,只有10张票20人买,那就要确保不能卖重,不能多卖.看下面例子:

package thread;

/**
 * @Author lyf
 * @Date 2018/11/17 0017 14:13
 */
public class Ticket 
  private int num = 10;

  public void buy() 
    if (num > 0) 
      try 
        Thread.sleep((long) (Math.random() * 100));
       catch (InterruptedException e) 
        e.printStackTrace();
      
      System.out.println("抢到第" + num-- + "张票...");
     else 
      System.out.println("票已售罄...");
    
  

  public static void main(String[] args) 
    final Ticket ticket = new Ticket();
    for (int i = 0; i < 200; i++) 
      new Thread(() ->  ticket.buy(); ).start();
    
  

 

技术分享图片
 

 

多线程操作下,就会出现多卖的情况.如果要解决,可以通过加锁synchronized方式来实现.把上边的代码修改如下:

public synchronized void buy() 
  ...

 

技术分享图片
 

可以保证不存在多卖情况.

 

线程创建_同步_通信(代码片段)

目录1.基本概念:程序、进程、线程2.并行和并发3.创建线程的两种方式3.1通过继承Thread方式3.1.1步骤:3.1.2两个问题3.1.3案例演示3.2通过实现Runnable的方式3.2.1步骤3.2.2代码演示3.3两种方式的比较4.Thread类中常用方法4.1常用方法4.2线... 查看详情

创建线程的方式以及executors的四种线程池(代码片段)

创建线程有几种方式?面试常问的问题,一般回答3种方式,及格;如果你能具体的说4种,那你就满分了,第四种是通过Executors创建线程池。先来说说创建线程的3种方式:一、继承Thread类publicclassExtendsT... 查看详情

java多线程——创建线程的3种方法(代码片段)

...统分配资源的单位,线程是CPU调度的单位。2.单线程和多线程的区别3.C++中如何开启子 查看详情

创建线程的3种方式(代码片段)

1方式一:创建Thread的子类对象1-1创建一个线程,继承Thread,重写run方法publicclassMyThreadextendsThreadpublicMyThread(Stringname)super(name);@Overridepublicvoidrun()for(inti=0;i<100;i++)System.out.println(getName()+i);1-2测试类publicclasstest2publicstaticvoidmain(String[]a... 查看详情

java从入门到精通api02(代码片段)

...22.1同步锁2.1.1synchronized2.1.2特点2.1.3改造2.2线程锁2.2.1悲观锁和乐观锁2.2.2两种常见的锁2.2.3Synchronized2.2.4ReentrantReadWriteLock2.2.5两种方式的区别2.3线程创建的其他方式2.3.1ExecutorService/Executors2.3.2Callable/Future2.4单例设计模式2.4.1概念2.4.2... 查看详情

创建线程的方式以及executors的四种线程池(代码片段)

创建线程有几种方式?面试常问的问题,一般回答3种方式,及格;如果你能具体的说4种,那你就满分了,第四种是通过Executors创建线程池。先来说说创建线程的3种方式:一、继承Thread类publicclassExtendsT... 查看详情

几种创建线程方式thread类和runnable接口(代码片段)

对于很多想学习java的人来说,经常听别人说线程难,其实真正理解了线程后,一点都不会觉得线程难,这里我为大家梳理下线程的创建方式吧.一.线程的创建方式有三种1.继承Thread类2.实现Runnable接口3.实现Callable接口(返回结果并且可能... 查看详情

juc-线程创建的四种方式+原理分析(代码片段)

文章目录一、继承Thread1、创建空线程2、创建Thread线程二、实现Runnable1、代码实现2、实现原理3、继承Thread和实现Runnable的优缺点三、实现Callable交给FutureTask1、Callable2、FutureTask3、RunnableFuture4、Future5、原理分析6、代码实现7、分析... 查看详情

juc-线程创建的四种方式+原理分析(代码片段)

文章目录一、继承Thread1、创建空线程2、创建Thread线程二、实现Runnable1、代码实现2、实现原理3、继承Thread和实现Runnable的优缺点三、实现Callable交给FutureTask1、Callable2、FutureTask3、RunnableFuture4、Future5、原理分析6、代码实现7、分析... 查看详情

并发编程(壹):创建线程的三种方式及其对比(代码片段)

创建线程的三种方式及其对比1.继承Thread类(1).继承Thread类。并重写run()方法,该方法无参数,无返回值;(2).创建子类实例,并实例化对象;(3).通过start()方法启动,注意:不是通过run()方法启动。publicclassThreadDemoextendsThreadpublicvoid... 查看详情

并发和多线程--abstractqueuedsynchronizer基本原理(代码片段)

...双向链表,也就是通过其内部的Node实现。  2.AQS有排他锁和共享锁两种模式,子类可以实现内部类选择实现一种,当然也可以通过两个内部类定义两种锁,例如ReentrantReadWriteLock,一个读锁,一个写锁。  3.子类通过对volatile... 查看详情

python多进程和多线程的使用(代码片段)

文章目录1.Python多进程创建使用2.进程的编号id3.Processname参数(进程名)4.多进程的参数args和kwargs5.进程之间不共享全局变量6.守护进程7.多线程7.1线程介绍7.2多线程实现方式8.线程的无序执行9.守护线程10.线程之间共享全局变量11.线... 查看详情

java基础知识点笔记总结(代码片段)

文章目录1.IntellijIDEA软件使用2.多线程的概念3.方式一继承Thread线程3.1继承Thread创建线程3.2Thread方式两个问题3.3Thread匿名对象创建线程3.4Thread类常用的方法3.5线程的调度4.方式二实现Runnable接口创建多线程5.两种创建多线程方式的对... 查看详情

回炉再造-多线程的创建(代码片段)

...种方式创建:    1.通过继承Thread类来创建并启动多线程的方式  2.通过实现Runnable接口来创建并启动线程的方式  3.通过实现Callable接口来创建并启动线程的方式  4.总结Java中创建线程的方式,比较各自优势和区别一... 查看详情

线程概述以及线程的两种创建方式(代码片段)

...xtendsThreadprivateStringname;publicCountThread(Stringname)super(name);/***线程的执行体**创建新执行线程有两种方法,一种方法是将类声明为Thread的子类,该子类应该重写Thread类中的run方法*接下来可以分配并且启动该子类的实例 查看详情

四万字长文总结多线程,一篇就够了!(代码片段)

...的优化2)锁粗话3)锁消除<2>常见的锁策略及CAS(1)乐观锁和悲观锁(2)自旋锁(3)可重入锁<3>Lock体系(1)Lock接口1)使用Lock锁实现线程同步2)Lock加锁的四种方式 查看详情

创建线程的两种方式比较threadvsrunnable(代码片段)

1.首先来说说创建线程的两种方式一种方式是继承Thread类,并重写run()方法 1publicclassMyThreadextendsThread2@Override3publicvoidrun()4//TODOAuto-generatedmethodstub5678//线程使用9MyThreadmt=newMyThread();//创建线程10mt.start();//启动 查看详情

创建多线程的4种方式(代码片段)

1.线程是什么?    线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位。每个程序程序都至少有一个线程,也即是程序本身。2.线程状态    Java... 查看详情