初学Java---Java SE-线程(Thread)部分学习

《Java SE实战指南》24-02:创建线程 更新中 阅读详情

第三部分Java SE-Java应用


第4单元 线程(Thread)部分学习笔记


Part1 动手做任务

一、创建线程的两种方式(面试题)

Java语言内在支持多线程机制。

为什么提供两种创建线程的方式?
  • 答:当一个类已经有了某个父类的话,就不能再继承Thread类了,只能实现Runnable接口。
1.方式一:继承Thread类,观察程序的输出

实现步骤:

  • (1).继承父类Thread
  • (2).重写run方法(线程主体)
public class MyThread extends Thread {
	public MyThread(String name) {
		super(name);
	}
	/**
	 * 线程做的事情在run方法里写,此方法来自父类Thread,子类重写父类方法
	 */
	public void run() {
		for (int i = 0; i < 10; i++) {
			//Thread.currentThread().getName()得到当前线程的名字
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}
	public static void main(String[] args) {
		MyThread t1 = new MyThread("张三");
		t1.start();//启动线程的方法
		//t1.run();run方法能被调用,但是就失去了线程的意义
		MyThread t2 = new MyThread("李四");
		t2.start();
	}
}

特别注意:启动线程用start()方法

2.方式二:实现Runnable接口,观察程序输出

实现步骤:

  • (1).实现Runnable接口
  • (2).创建类对象
  • (3).用Thread类包装
public class MyThread1 implements Runnable {
	@Override //实现接口中的run方法
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}
	public static void main(String[] args) {
		MyThread1 t1 = new MyThread1();
		Thread th1 = new Thread(t1,"张三");//必须有这一步
		th1.start();
		
		Thread th2 = new Thread(new MyThread1(),"李四");
		th2.start();
	}
}
3.线程调度简单分析

线程调度策略,与OS有关,执行代码的是CPU;

  • 在某一个时间点上,CPU能同时执行多个程序吗?
    • 答:不能,因此导致了执行过程不是确定的。

二、多个线程共享数据时引发的问题-非同步(非线程安全,效率较高)

重点:多个线程共享同一数据时,有可能产生共享问题。以下示例模拟多个线程共享一个银行账户。
场景:一个存折、一张银行卡对应的是同一个账户,同时取款。需要编写4个类:账户类,该类对象被共享;First和Second类,代表存折和银行卡;Test类是测试类,分析结果:

1.账户类Account:
public class Account {
	/** 账户余额 */
	private int balance;
	public Account(int balance) {
		this.balance = balance;
	}
	/**
	 * 取款方法
	 * @param count 要取款的金额
	 */
	public void withDraw(int count) {
		System.out.println(Thread.currentThread().getName() + "进入取款方法。");
		if (balance >= count) {
			System.out.println(Thread.currentThread().getName() + "可以取款。");
			balance = balance - count;
			System.out.println(Thread.currentThread().getName() + ":取了" + count + ";结余:" + balance);
		} else {
			System.out.println(Thread.currentThread().getName() + "取款时余额不足!!!");
		}
	}
}
2.First类:代表存折
public class First extends Thread {
	Account account;//银行账户
	public First(Account account) {
		this.account = account;//给账户初始化
	}
	public void run() {
		account.withDraw(1000);//调用取款方法
	}
}
3.Second类:代表银行卡
public class Second extends Thread {
	Account account;
	public Second(Account account) {
		this.account = account;
	}
	public void run() {
		account.withDraw(500);
	}
}
4.Test测试类
public class Test {
	public static void main(String[] args) {
		Account acc = new Account(1000);//建立账户对象,余额1000,该对象被两个线程共享
		First first = new First(acc);//下面两个进程共享同一账户
		Second second = new Second(acc);
		first.start();//启动线程
		second.start();
	}
}
  • 可能的输出结果(输出结果是不确定的,多执行几次,看输出结果):
//Thread-1进入取款方法。
//Thread-0进入取款方法。
//Thread-1可以取款。
//Thread-0可以取款。
//Thread-1:取了500;结余:500
//Thread-0:取了1000;结余:-500 //余额已经不够要取得了,居然还能取,多线程共享数据引发问题
  • 出现问题的原因:多线程共享同一数据引发的同步问题。线程的调度是由操作系统完成的,在存折线程执行取款过程中,有可能被银行卡线程打断,导致存折线程取款过程不连续,引发了上边的问题。
  • 解决方案:使用线程同步,让存折取款过程不被打断;在Account类取款方法加入同步(synchronized)关键字即可。

三、如何实现线程同步(效率降低,线程安全)

synchronized是Java关键字,称为同步关键字,在多线程共享数据时使用。

1.方式一:同步整个方法-在方法前加synchronized

线程同步就是保证多个线程共享数据,不出问题;即共享数据是安全的。

public class Account {
	/** 账户余额 */
	private int balance;
	public Account(int balance) {
		this.balance = balance;
	}
	/**
	 * 取款方法
	 * @param count 要取款的金额
	 */
	public synchronized void withDraw(int count) {
		System.out.println(Thread.currentThread().getName() + "进入取款方法。");
		if (balance >= count) {
			System.out.println(Thread.currentThread().getName() + "可以取款。");
			balance = balance - count;
			System.out.println(Thread.currentThread().getName() + ":取了" + count + ";结余:" + balance);
		} else {
			System.out.println(Thread.currentThread().getName() + "取款时余额不足!!!");
		}
	}	
}
  • 其他类没有变化,执行Test类:加上之后,取款过程不会被打断,便免了问题的发生。
2.方式二:同步局部代码(代码块)

Account类中的变化:

public class Account {
	/** 账户余额 */
	private int balance;
	public Account(int balance) {
		this.balance = balance;
	}
	/**
	 * 取款方法
	 * @param count 要取款的金额
	 */
	public void withDraw(int count) {
		System.out.println(Thread.currentThread().getName() + "进入取款方法。");
        //同步代码块
		synchronized (this) {
			if (balance >= count) {
				System.out.println(Thread.currentThread().getName() + "可以取款。");
				balance = balance - count;
				System.out.println(Thread.currentThread().getName() + ":取了" + count + ";结余:" + balance);
			} else {
				System.out.println(Thread.currentThread().getName() + "取款时余额不足!!!");
			}
		}
	}	
}

四、sleep方法

线程“睡觉”方法,在“睡觉”过程中,不释放对象锁。

public class StudentThread extends Thread {
	public void run() {
		for (int i = 0; i < 5; i++) {
			try {//sleep()方法 ,线程睡觉2秒钟
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		StudentThread st = new StudentThread();
		st.start();
	}
}

五、如何实现生产者-消费者问题

  • 涉及到:线程通信问题,多个线程之间要彼此通信。使用到的方法:wait()、notify()、notifyAll()和线程同步synchronized。

阐述的问题:生产者生产产品,放到一个盒子里,这个盒子只能放一件商品;生产者通知消费者来取,消费者取走产品后,通知生产者,可以继续生产了。如果消费者没有取走,生产者就等待;如果生产者没有生产出产品,消费者等待。

  • 共有4个类:服务员、厨师(生产者)、吃货(消费者)、测试类,厨师和吃货共享服务员
1.服务员类Clerk
//服务员类,其对象被生产者和消费者共享
public class Clerk {
	private int product = -1;// -1 表示目前服务员手里没有产品
	/**
	 * 这个方法由厨师(生产者)调用,此方法往服务员里放产品
	 * @param p 产品
	 */
	public synchronized void setProduct(int p) {
		if (this.product != -1) {//服务员手里有东西
			try {//服务员手里有东西,厨师需要等待
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.product = p;
		System.out.printf("厨师(生产者)炒出(%d)%n",this.product);
		notify();//通知等待区的一个吃货(消费者)可以继续了,,但只会有一个进程获得执行机会
	}
	/**
	 * 这个方法由吃货(消费者)调用,该方法从服务员手里取产品
	 * @return 产品
	 */
	public synchronized int getProduct() {
		if (this.product == -1) {//服务员手里没有东西
			try {//吃货需要等待
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		int p = this.product;
		System.out.printf("吃货(消费者)吃掉 (%d)%n",this.product);
		System.out.println("");
		this.product = -1;//取走产品
		notifyAll();//通知所有生产者线程,可以继续生产了,但只会有一个线程会获得执行机会
		return p;
	}
}
2.生产者类Produce
//生产者(厨师)线程类
public class Producer implements Runnable {
	private Clerk clerk;
	public Producer(Clerk clerk) {
		this.clerk = clerk;
	}
	public void run() {
		System.out.println("厨师(生产者)开始炒制菜品。。。");
		for (int produce = 1; produce <= 10; produce++) {
			try {//暂停随机时间
				Thread.sleep((int)Math.random() * 3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}//将产品交给服务员
			clerk.setProduct(produce);
		}
	}
}
3.消费者类Consumer
//消费者(吃货)线程类
public class Consumer implements Runnable {
	private Clerk clerk;
	public Consumer(Clerk clerk) {
		this.clerk = clerk;
	}
	public void run() {
		System.out.println("吃货(消费者)开始大吃。。。");
		for (int i = 1; i <= 10; i++) {
			try {//等待随机时间
				Thread.sleep((int)Math.random() * 3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}//从服务员处取走产品
			clerk.getProduct();
		}
	}
}
4.测试类Test
//测试类
public class ProductTest {
	public static void main(String[] args) {
		Clerk clerk = new Clerk();
		//生产者线程
		Thread pt = new Thread(new Producer(clerk));
		//消费者线程
		Thread ct = new Thread(new Consumer(clerk));
		pt.start();
		ct.start();
	}
}
输出结果:
//吃货(消费者)开始大吃。。。
//厨师(生产者)开始炒制菜品。。。
//厨师(生产者)炒出(1)
//吃货(消费者)吃掉 (1)

//厨师(生产者)炒出(2)
//吃货(消费者)吃掉 (2)

//厨师(生产者)炒出(3)
//吃货(消费者)吃掉 (3)

//厨师(生产者)炒出(4)
//吃货(消费者)吃掉 (4)

//厨师(生产者)炒出(5)
//吃货(消费者)吃掉 (5)

//厨师(生产者)炒出(6)
//吃货(消费者)吃掉 (6)

//厨师(生产者)炒出(7)
//吃货(消费者)吃掉 (7)

//厨师(生产者)炒出(8)
//吃货(消费者)吃掉 (8)

//厨师(生产者)炒出(9)
//吃货(消费者)吃掉 (9)

//厨师(生产者)炒出(10)
//吃货(消费者)吃掉 (10)

Part2 口述部分(面试题)

1.程序、进程和线程的区别是什么?

  • 程序:代码,实现某种功能。
  • 进程:执行当中的程序,会被载入内存,对应一个进程,进程独占系统资源,不同的进程之间,资源不能共享,进程由操作系系统管理。
  • 线程:线程包含在进程中,一个进程可能包含多个线程,多个线程共享系统资源,线程由操作系系统管理。多个线程可以“同时”执行。迅雷下载、网际快车FlashGet。

2.线程实现方式是什么?

  • 两种方式:代码见上边
    • (1)继承Thread类
    • (2)实现Runnable接口

3.线程的状态(生命周期)有哪些?

  • 面试点:线程有5个状态:创建、就绪、阻塞、运行、消亡;start()调完是就绪态。

在这里插入图片描述


4.什么是锁机制?如何理解锁机制?死锁?同步目的以及优缺点?

  • (1)答:即线程同步的机制:

  • (2)理解:synchronized机制是给共享资源上锁,只有拿到锁的线程才可以访问共享资源,这样就可以强制使得对共享资源的访问都是顺序的。Java实现多线程的同步操作很简单,只要在需要同步的方法或代码块中加入synchronized关键字,它能保证在同一时刻最多只有一个进程执行同一个对象的同步代码,可保证不会被干扰。如果同步了,哪个线程获得锁,哪个线程才能执行。

  • (3)锁只有1个;死锁:即锁死了。死锁解决不了,只能预防;例如:银行家算法。

  • (4)同步的目的:防止多线程共享数据出现问题。比如:取款问题。

  • (5)同步的优缺点:

    • 优点:数据不会出问题
    • 缺点:效率降低

5.sleep、wait、 yield等方法的分析

  • sleep()方法: 被调用时不释放锁,可以在任何地方调用;在睡眠期间一直保持状态,直到睡眠时间到。
  • yield()方法-让位方法:不释放锁,当一个线程调用该方法后,这个线程会停下,它会观察当前其它线程的执行优先级高低;如果别的线程优先级高于自己,他就会停下等待;否则他继续执行。
  • wait()方法: 被调用时释放锁,只能在同步方法或语句块中调动。
  • join()方法:一个进程加入到另一个进程中。
  • start()方法:启动进程。

6.线程方法和对象方法的区分

(1)线程方法:
  • 来自Thread类中的方法:start() 、run() 、sleep() 、yield()
(2)对象方法:
  • 来自Object类中的方法:wait()、notify() 、notifyAll()

7.如何结束线程?

  • (1)自然结束:run方法执行完毕。
  • (2)在run方法中发生异常。

8.什么场合使用同步?同步和异步的区别?

  • (1)答:数据被多线程共享时使用同步。
  • (2)区别:
    • 同步就是保证多个线程共享数据,不出问题;即共享数据是安全的。效率降低,线程安全。
    • 异步非线程安全,效率较高。

9.多线程共享时注意什么?

  • 答:避免彼此的 打断,导致数据的紊乱。

10.什么是并发?

  • 答:多线程同时执行,指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

11.Java线程锁有哪些?各有什么特点?

synchronized(给共享资源上锁)
  • 常用于维护数据一致性,可保证修饰的代码在执行过程中不会被其他线程干扰。使用synchronized修饰的代码具有原子性和可见性。
ReentrantLock
  • 可重入锁,顾名思义,这个锁可以被线程多次重复进入进行获取操作。
Semaphore:信号量与互斥锁
  • 通过acquire()与release()方法来获得和释放临界资源,避免死锁和读脏数据。
AtomicInteger:实现锁

  • 同步就是保证多个线程共享数据,不出问题;即共享数据是安全的。效率降低,线程安全。
    • 异步非线程安全,效率较高。

9.多线程共享时注意什么?

  • 答:避免彼此的 打断,导致数据的紊乱。

10.什么是并发?

  • 答:多线程同时执行,指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

11.Java线程锁有哪些?各有什么特点?

synchronized(给共享资源上锁)
  • 常用于维护数据一致性,可保证修饰的代码在执行过程中不会被其他线程干扰。使用synchronized修饰的代码具有原子性和可见性。
ReentrantLock
  • 可重入锁,顾名思义,这个锁可以被线程多次重复进入进行获取操作。
Semaphore:信号量与互斥锁
  • 通过acquire()与release()方法来获得和释放临界资源,避免死锁和读脏数据。
AtomicInteger:实现锁

ISO 26262中的失效率计算:Mission profile的使用 Mission profile:任务剖面,即产品在完成规定任务这段时间内所经历的时间和环境的时序描述;集成电路在工作时环境温度是在不停变化的,同时也存在运行状态和非运行状态;为此标准提出了根据任务剖面(Mission profile)以及集成电路的实际结温来评估热幅度变化、循环温度幅值等因素的影响;汽车电子元器件相关的Mission profile参考IEC TR 62380:Table 11。 阅读详情

相关推荐

群晖Docker安装GitLab

external_url ‘http://lanweixia.synology.me’ 这种情况访问页面的时候加上端口没问题,但是会导致http的克隆地址没有端口。external_url ‘http://lanweixia.synology.me:8000’ 加端口的话,又会导致页面访问不了,Gitlab也一直处于启动状态。​ 完成以后修改docke—>gitlab—>config---->gitlab.rb。就是上面改的端口(docker的端口)首次进入,会设置密码,这个密码就是用户名。

Lim的博客 9098

Java多线程

1. 基本概念 程序(program) 程序是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码(还没有运行起来),静态对象。 进程(process) 进程是程序的一次执行过程,也就是说程序运行起来了,加载到了内存中,并占用了cpu的资源。这是一个动态的过程:有自身的产生、存在和消亡的过程,这也是进程的生命周期。 进程是系统资源分配的单位,系统在运行时会为每个进程分配不同的内存区域。 线程(thread) 进程可进一步细化为线程,是一个程序内部的执行

m0_64113557的博客 256

RK3576平台部署NanoTrack:边缘AI视觉跟踪实战指南

边缘AI部署是将深度学习模型在资源受限的嵌入式设备上高效运行的关键技术,其核心在于模型压缩、硬件适配与软件栈优化。通过INT8量化、算子融合与内存优化等原理,能显著降低模型计算量与内存占用,从而在嵌入式NPU上实现实时推理。这项技术的价值在于为安防监控、无人机视觉、工业检测等场景提供低功耗、高响应的智能感知能力。以瑞芯微RK3576平台部署轻量级视觉跟踪模型NanoTrack为例,其过程涉及模型结构分析、RKNN工具链转换、C++推理程序开发及多线程性能优化,完整展现了从算法到产品的工程化路径,为开发者提供

weixin_31887307的博客 426

Java并发编程(一)Thread详解

一、概述 在开始学习Thread之前,我们先来了解一下 线程和进程之间的关系: 线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。 线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。 由上描述,可以得知...

weixin_34146410的博客 363

结构力学程序算法理论基础(一)————虚功原理

1.约束 定义约束:限制质点或者质点系运动的条件称为约束,表示这些限制条件的数学方程称为约束方程。 (1)几何约束 限制质点或者质点系在空间的几何位置的条件称为几何约束.如单摆,其中质点M可绕固定点O在平面Oxy内摆动,摆长为l.这时摆杆对质点的限制条件是:质点M必须在以点O为圆心,以l为半径的圆周上运动.其约束方程为: 又质点M在固定的曲面上运动,那么曲面方程就是质点M的约束方程,即 上...

l93919861的博客 4510

聚类分析(超全超详细版)

聚类分析是一种典型的无监督学习, 用于对未知类别的样本进行划分,将它们按照一定的规则划分成若干个类族,把相似(距高相近)的样本聚在同一个类簇中, 把不相似的样本分为不同类簇,从而揭示样本之间内在的性质以及相互之间的联系规律 聚类算法在银行、零售、保险、医学、军事等诸多领域有着广泛的应用 聚类分析基础 聚类分析的概念 聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象分组。目的是...

Gfqwy2021 22万+

JAVA SE 多线程(上)

JAVA 多线程 , 万字解析.

双吉堡工程专业的一名27届Javaer。 3508

Ubuntu系统 nano 编辑器使用教程

• 原因:文件编码不兼容(如 Windows 的 CRLF 换行符)。• 若使用 SSH 工具(如 PuTTY),确保终端设置中未占用。掌握这些操作后,你可以高效使用 nano 完成大部分文本编辑任务!• 底部快捷键栏:显示常用操作的快捷键(• 如果文件已修改,会提示是否保存:按。• 顶部状态栏:显示文件名和编辑状态。表示 Ctrl + G(查看帮助)。保存时自动生成备份文件(原文件名后加。• 强制保存只读文件:用。启动 nano 时添加。启动 nano 时添加。(重做)触发自动缩进。

qq_44534541的博客 2083

Java SE线程的创建

摘要:本文介绍了两种Java线程创建方式:继承Thread类和实现Runnable接口。通过示例代码详细演示了每种方式的实现步骤,包括创建子类/实现类、重写run()方法、启动线程等关键操作。特别强调了start()与run()的区别,以及如何避免IllegalThreadStateException异常。文章还提供了四种不同的线程实现写法,包括常规类、匿名类、匿名对象和Lambda表达式方式,展示了打印100以内奇偶数的具体应用场景。

778

【Web攻防】SQLMap实战进阶:从数据猜解到高权限渗透的全流程指南

本文介绍了SQLMap工具在Web安全渗透测试中的实战应用,重点讲解了数据猜解、高权限操作、复杂请求提交、Tamper脚本开发和指纹绕过等核心场景。文章提供了可直接复用的命令示例,包括数据库信息获取、文件读写、命令执行等操作,并详细说明了POST/JSON/Cookie注入的实现方法。同时,介绍了Tamper脚本的开发模板和指纹伪装技巧,帮助降低检测风险。最后强调SQLMap在自动化渗透全链路中的价值,从漏洞发现到权限提升的完整流程,并提供了优化测试效率的实用建议。所有技术内容仅限合法授权场景使用。

YsChunQiu777的博客 440

【实际操作】DenseFusion复现过程详解-YCB-Video数据集

这一篇是在YCB-Video数据集上的训练和测试过程。本次实验建立在实现LineMod数据集训练基础之上,因为前期的环境搭建都是一样的。首先,需要下载YCB-Video数据集,可以自己找找百度网盘资源,大概有两百多G。把下载下来的数据放在/work/DenseFusion/datasets/ycb/下并命名为YCB_Video_Dataset。同样的,激活自己的环境并进入 /work/DenseFusion/下,用命令:./experiments/scripts/train_ycb.sh出现以下内容开始训练

weixin_44564705的博客 3558

Java SE:多线程(Thread)

优先级高的线程先执行的概率更高,但不是绝对,线程的执行时机都是随机事件概率问题,Java中默认的线程默认优先级为5,可以调用方法更改线程的优先级。用到Java提供的队列类(BlockingQueue)此时的队列充当平台,线程之间数据交换协调的平台,要保证线程在同一队列之间协调运行。Java虚拟机默认先执行完main线程在执行其他线程,若要其他线程在main线程之前执行可调用插入线程方法。没有线程池存放线程时,我们创建的线程当运行完毕会自动销毁,而线程池可以存储线程,提高资源复用率。未完待续......

2301_79526467的博客 949

matlab 受约束的 Delaunay 三角剖分【2025最新版】

matlab内置调用函数实现受约束的 Delaunay 三角剖分并将结果保存为STL文件

点云侠的博客 1875

Java SE 快学到头了,总结一下 Java多线程部分吧

进程是一个正在运行的程序进程是系统进行资源分配和调用的独立单位每一个进程都有它自己的内存空间和系统资源Thread 类是java.lang包下的一个线程类,用来实现 Java 多线程局限性Java 支持类的单继承,如果某个类已经继承了其他父类,就无法再继承 Thread 类来实现多线程。Callable 接口防止实现的多线程是通过 FutureTask 类来封装和管理返回结果的,该类的直接父接口是 RunnableFuture。

weixin_44066506的博客 882

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

浅析Thread和线程的关系

浅析Thread和线程

flyingmylife的博客 1227

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【Java SE】多线程(一):认识线程与Thread类

本文摘要: 线程是进程内的独立执行单元,用于提高程序执行效率。文章从线程本质、必要性、与进程区别等方面介绍了线程概念,重点讲解了Java多线程的实现方式。线程通过共享进程资源实现轻量级并发,能充分利用多核CPU和优化IO等待时间。Java线程本质是对操作系统线程的封装,提供了4种创建方式:继承Thread类、实现Runnable接口、匿名内部类和Lambda表达式。其中start()方法会创建新线程执行run()逻辑,而直接调用run()只是普通方法调用。文章通过代码示例展示了主线程与子线程的并行执行

记录了从0学习Java技术栈的日常 762

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java SE 线程

System.out.println("生产者生产了" + this.getBrand() + "-----" + this.getName());System.out.println("生产者生产了" + this.getBrand() + "-----" + this.getName());-- 如果未来的另一个线程调用了相同对象的notify()、notifyAll()方法,等待池中的线程就会被唤醒,可以重新进入锁池争抢该对象的锁;注意是沿着wait方法之后;

ALLWE的博客 976

java线程详解01:Thread类详解

本文对Thread类的各个属性,方法进行详细介绍

thinking-fish的博客 1156

Java SE 多线程

Java SE 多线程 目录Java SE 多线程1、线程概念1.2、程序与进程与线程1.3、优缺点2、创建线程2.1 继承Thread接口2.2 实现Runnable接口2.3 练习2.4 Callable 接口3、线程的五种状态3.1 新生状态3.2 就绪状态3.3 运行状态3.4 阻塞状态3.5 终止状态4、常用方法4.1、sleep() 睡眠--阻塞4.2、yield()方法- -礼让4.3、join() 方法--插队4.4、interrupt() 中断标识4.5、守护线程与用户线程4.6、优先级及

忄凝^的博客 221

【Java Se】常用工具类之多线程

前言 到多线程这一块说明我们【Java Se】专栏就快结束了,感谢一直看过来的兄弟。多线程其实是非常复杂的,我们只是学一个入门,知道有这么个东西并且怎么运用它! 目录前言初识多线程线程的创建Thread类创建线程Runnable接口创建接口三级目录 初识多线程 在学习线程之前你得先知道什么是进程,以及进程与线程的关系与区别。 当一个程序被运行时,就开启了一个进程, 比如启动了QQ,网易云。而一个进程内可分为多个线程,一个线程其实就是一个指令流,cpu调度的最小单位,由cpu一条一条执行指令。 操作系统调度的

apple_51673523的博客 2668

Java SE 099 Thread类源代码深度剖析

Java SE 099 Thread类源代码深度剖析 1.通过实现Runnable接口实现线程 (1)实现Runnable接口的类实现run方法。 (2)通过建立一个实现了Runnable接口的类,并以它作为线程的目标对象来创建一个线程。 (3)Runnable接口:定义了一个抽象方法run()。定义如下 @FunctionalInterface public interface Runnable { /** * When an object implementing interface

青风百草 700

Java SE——创建线程的四种方式

  创建线程的方式有四种: 1.继承Thread类 2.实现Runnable接口 3.实现Callable接口 4.使用线程池 在这四种方法中,根据《Effective Java》一书中指出优先使用线程池 在继承Thread类和实现Runnable接口两种方法中,使用Runnable接口更加推荐(不会有单继承局限的问题) 若想要线程最终返回结果,使用实现Callable接口(只有这...

L_X_Y_HH的博客 775
上一篇: 初学Java---Java SE-I/O流(File类的使用)学习
下一篇: 初学Java---Java SE-集合(List、Set、Map、链表、栈和Collection的使用)
慕兮IT
博客等级 码龄8年 8粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕兮IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值