今天,我们开始Java高并发与多线程的第四篇,锁。 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了。 但是本篇是高并发里面真正的基石,需要大量的理解和实践,一环扣一环,环环相扣,不难,但是需要认真去读。 好了,现在开始。 --------------第一部分,咱们要谈到java里面的两个用于保证线程之间有序性的关键字-------------- 【synchronized】 synchronized是Java中解...
分别继承Thread和实现Runnable,创建三个线程卖票。 package com.itheima;class MyThread extends Thread{private static int tickets = 100;@Overridepublic void run() {while (true){if(tickets > 0){System.out.println(Thread.currentThread().getName() + ": 卖票,票号为:" + tickets );tickets--;}else return;}} } public class T {public static void main(String[] args) {MyThread thread1 = new MyThread();thread1.s...
线程状态(五大状态)void setPriority(int newPriority) 更改线程的优先级。static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。void join() 等待该线程终止。static void yield() 暂停当前正在执行的线程对象,并执行其他线程。void interrupt() 中断线程。 (别用这个方式)boolean isAlive() 测试线程是否处于活动状态。线程停止不推荐使...
今天,我们开始Java高并发与多线程的第二篇,线程的实现方式。 通常来讲,线程有三种基础实现方式,一种是继承Thread类,一种是实现Runnable接口,还有一种是实现Callable接口,当然,如果我们铺开,扩展一下,会有很多种实现方式,但是归根溯源,其实都是这几种实现方式的衍生和变种。 我们依次来讲。 【第一种 继承Thread】 继承Thread之后,要实现父类的run方法,然后在起线程的时候,调用其start方法。 1 public clas...
重在展示多线程ThreadPoolExecutor的使用,和线程同步器CountDownLatch,以及相关CAS的原子操作和线程安全的Map/队列。 ThreadPool主线程 1 import java.io.BufferedWriter;2 import java.io.File;3 import java.io.FileWriter;4 import java.util.*;5 import java.util.concurrent.*;6 import java.util.concurrent.atomic.AtomicInteger;7 import java.util.concurrent.atomic.AtomicReferenceArray;8 9 /** 10 * ClassName: Th...
Java-多线程-线程安全-同步代码块在多个线程都在争抢公共资源的时候,可能会出现抢到公共资源后,还没有完成所有操作就被其他线程抢走了,这可能导致程序运行结果不符合我们的意愿的情况 例如示例所示,在没有加同步代码块的时候,可能出现买到重复的票或者买到第0、-1张票的情况 为了解决线程安全的问题,可以在可能出现线程危险的地方加上同步代码块,就是使用synchronized(this){}将可能出现问题的代码包裹住 但是在使用的时候也...
Java-多线程-实现Runnable接口创建线程类在Java中,创建子线程的一种方式就是让一个类实现Runnable接口 一个类在实现了Runnable之后,还必须要重写run方法,实现的业务逻辑必须写在run方法中才能创建子线程 通过实现Runnable接口创建的子线程对象没有start方法,想要启动线程,就必须创建Thread对象,并将实现了Runnable接口的类的对象,作为参数传过去,Thread的对象才能调用start方法 示例:先准备一个实现了Runnable接口的类pub...
程序,进程,线程的基本概念 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。进程(process)是程序的一次执行代码,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周期如:运行中的QQ程序是静态的,进程是动态的进程作为资源分配的单位,系统在运行时会为每个进程分配不同的区域线程(thread),进程可进一步细化为线程,是一个程序内...
服务器: public class TCPServer {public static void main(String[] args) {ServerSocket server= null;try {server = new ServerSocket(8888);} catch (IOException e) {e.printStackTrace();}/**让服务器一直处于监听状态* */while (true) {/**使用多线程来提高程序效率* 当有一个客户端上传文件的时候就创建一个线程来处理* */ServerSocket finalServer = server;new Thread(() -> {Socket socket=null;OutputStream os=null;F...
目录锁类型可中断锁公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁Synchronized与Static Synchronized举例Lock定义四种获取Lock的方法区别lock()tryLock()tryLock(long time, TimeUnit unit)lockInterruptibly()synchronized与Lock的区别synchronized和lock的用法区别synchronized和Lock性能区别synchronized和Lock用途区别 锁类型 可中断锁在等待获取锁过程中可中断 Lock就...
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图:上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点,Java中的多线程也就基本上掌握了。主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调...
此文转载自:https://blog.csdn.net/qq_43097201/article/details/112452391写在前面: 相信不少开发者在遇到项目对数据进行批量操作的时候,都会有不少的烦恼,尤其是针对数据量极大的情况下,效率问题就直接提上了菜板。因此,开多线程来执行批量任务是十分重要的一种批量操作思路,其实这种思路实现起来也十分简单,就拿批量更新的操作举例: 整体流程图 步骤 获取需要进行批量更新的大集合a,对大集合进行拆分操作,分成n个小...
初始化线程的四种办法 继承Thread类实现Rannable 接口实现callable 接口 + FutureTask (可以获取处理结果和处理异常)线程池 继承Thread实现 public class ThreadTest {public static void main(String[] args) {System.out.println("主线程启动");Thread1 thread1 = new Thread1();thread1.start();System.out.println("主线程结束");}public static class Thread1 extends Thread{@Overridepublic void run() {System.out.print...
多线程(Thread) 1.自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用start()方法启动线程 //创建线程的方式之一:继承Thread类,重写run()方法,调用start开启线程 //总结:注意,线程开启不一定立即执行,由cpu调度执行 public class TestThread1 extends Thread{@Overridepublic void run() {//run方法线程体for (int i = 0; i < 200; i++) {System.out.println("我在看代码---"+i);}}public static...
1. 继承java.lang.Thread package com.childers.thread;import org.apache.commons.io.FileUtils;import java.io.File; import java.io.IOException; import java.net.URL; /* * 多线程下载多个图片 * 1. 创建类继承Thread,并重写run方法; * 2. 在Download类下创建downloadImg方法; * 3. 使用commons-io中的FileUtils.copyUrlToFile(Url,File)方法,根据参数做对应的下载操作; * 4. 在run方法中调用downloadImg(); * 5. 在main...