0x00 前言 在一个工具开发中,如果该工具需要不断的去执行同一个动作或者是请求的话,使用单线程是非常慢。还是拿一个目录扫描器来举例子,比如我们需要开发一个目录扫描器,我们的字典里有10000个字典,,只有一个线程去发起http的请求,这样的速度是非常慢的,但是如果我们用到多线程,4个线程,每个线程请求2500个字典,那么我们花费的时间就可以缩短4倍。 0x01 多线程概念 线程与进程 在了解多线程前,首先要清楚多线程和多进程...
/*** 测试Thread中常用方法* 1.start();启动线程,调用当前线程的run();* 2.run();一般要重写,将创建线程要执行的操作声明在此方法中* 3.currentThread();静态方法,返回当前代码执行的线程* 4.getName();获取当前线程的名字* 5.setName();设置当前线程名字*6.yield();释放当前cpu执行权,* 7.join();在线程a中调用线程b的join(),此时线程a进入阻塞状态,直到线程b完全执行完之后,线程a才结束阻塞状态* 8.stop();强制结束线程;已...
Java多线程 在Java的JDK开发包中,已经自带了对多线程技术的支持,可以很方便地进行多线程编程。实现多线程编程的方式有两种,一种是继承 Thread 类,另一种是实现 Runnable 接口。使用继承 Thread 类创建线程,最大的局限就是不能多继承,所以为了支持多继承,完全可以实现 Runnable 接口的方式。 继承 Thread 类// 继承 Thread类 重写 run()方法 public class ThreadDemo1 extends Thread {@Overridepublic void run() {f...
1 public class Thread_A extends Thread {2 Human human;3 4 public Thread_A(String name, Human human) {5 super(name);6 this.human = human;7 }8 9 @Override 10 public void run() { 11 for (int i = 0; i < 100; i++) { 12 human.setAge(human.getAge()+1); 13 System.out.println(getName()+"线程实现Human的年龄+1,当前年龄:"+human.getAge()); 1...
1,CAS是一种处理器指令,能够将read-modify-write和check-and-act之类的操作转换为原子性,但是不能保证可见性。2,Java中对象实例化a b=new a();在内存中的操作:首先分配对象所需的存储空间objRef=allocate(a.class);其次初始化引用对象,是一个默认值,而不是初始值invokeConstructor(objRef),最后将对象引用写入共享变量b=objRef。由于内存指令重排序,次序变为132,导致这个实例不为null,而是引用实例,而这个引用实例未初...
实现Runable接口 通过实现Runable接口中的run()方法 public class ThreadTest implements Runnable {public static void main(String[] args) {Thread thread = new Thread(new ThreadTest());thread.start();}@Overridepublic void run() {System.out.println("Runable 方式创建的新线程");} }继承Thread类 通过继承Thread类,重写run()方法,随后实例调用start()方法启动 public class ThreadTest extends Thread{@Overridepubli...
本书网站 基础篇 批处理操作系统内存里只能有一个程序,指令串行执行、效率低。于是引入进程(内存里分配了空间、正在运行的程序)的概念,加上CPU时间片轮转,实现了并发。后来人们不满于进程只能执行一个任务,引入线程的概念,于是QQ上可以一边聊天一边下载文件了。总结一下,就是进程让操作系统的并发性成为了可能,而线程让进程的内部并发成为了可能。 相比多进程,多线程实现并发有一些好处:通常需要使用共享资源,线程间的...
一、多线程创建 可以通过两种方式创建多线程。 方式一:继承Thread类 1、创建一个继承于Thread类的子类 2、重写Thread类的run() --> 将此线程执行的操作声明在run()中 3、创建Thread类的子类的对象 4、通过此对象调用start() /*** @description:多线程的创建:两种方式* @date: 2020/7/25 10:32* @author: winson*/ public class CreateThread {public static void main(String[] args) {MyThread t1 = new MyThread();t1.start...
多个线程访问共享对象和数据的方式 如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做。 如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,有如下两种方式来实现这些Runnable对象之间的数据共享: 将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象。每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样...
volatile: 能够保证线程可见性,当一个线程修改主内存共享变量能够保证对外一个线程可见性,但是他不能保证共享变量的原子性问题。 1. volatite特性 1.1 可见性 能够保证线程可见性,当一个线程修改共享变量时,能够保证对另外一个线程可见性, 1.2 顺序性 程序执行程序按照代码的先后顺序执行。 1.3 防止指令重排序 通过插入内存屏障在cpu层面防止乱序执行 2. volatile可见性public class VolatileTest extends Thread {/*** vol...
回忆了一下多线程锁相关内容,记录下来自己的理解,免得时间长遗忘。都是个人体会,不加实现代码,读者不必纠结,有错误请指出。 1.死锁 当在同步代码块里再调用同步代码时,当里层和外层不是同一把锁,可能会产生死锁问题。比如用ReentrantLock 实现同步时,两个不同的lock对象,线程竞争时就有可能死锁。线程1获取到锁1,需要获取锁2才能执行内部代码,但是内部代码锁2,被线程2持有,线程2又在等待线程1的锁,这样互相等待就成了...
Java中多线程的使用(超级超级详细) Thead类的使用 3 下面我们先来介绍一些基本方法 构造方法 public Thread() :分配一个新的线程对象。 public Thread(String name) :分配一个指定名字的新的线程对象。 public Thread(Runnable target) :分配一个带有指定目标新的线程对象。 public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字。 常用方法 public String getName() :获取当前线程名称。 p...
Java中多线程的使用(超级超级详细)线程池 7 什么是线程池? 线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 *使用多线程的好处:1.降低消耗,减少了创建和销毁线程的次数,每个线程都可以重复利用,可执行多个任务 2.提高响应速度,任务可以不需要等到线程创建就可以立即执行 3.提高线程的可管理性,根据系统的承受能力,调整线程池中工作线程的数目,防止消耗过多的内存,导致...
线程简介程序Process(静态)、进程(动态)、线程Thread 程序:在操作系统中运行的程序就是进程,比如你的QQ,播放器,游戏,IDE等等 进程:执行程序的一次过程,是系统资源分配的单位,main() 线程:一个进程有若干线程,一个进程至少有一个线程,是CPU调度和执行的单位 一些概念线程就是独立的执行路径; 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程; main()称之为主线程,为系统的入口,用于执行...
欢迎关注 CSDN:程序员小羊 微信公众号:程序员小羊目录80、PriorityBlockingQueue(compareTo 排序实现优先)81、DelayQueue(缓存失效、定时任务 )82、SynchronousQueue(不存储数据、可用于传递数据)83、LinkedTransferQueue84、LinkedBlockingDeque85、在 java 中守护线程和本地线程区别86、线程与进程的区别?87、什么是多线程中的上下文切换?88、死锁与活锁的区别,死锁与饥饿的区别?89、Java 中用到的线程调度算法是什么...