关键词:
搞明白 线程
锁
和多线程
系列
1.线程创建
线程创建常见的三种方式:
-
继承Thread类
-
实现Runnable接口
-
实现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... 查看详情