Java多线程-实例解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Java多线程-实例解析 Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。

Java多线程-实例解析

Java多线程实例 3种实现方法
Java中的多线程有三种实现方式:
1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。
2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法。
3.实现Callable接口,重写call方法。Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。有以下三点
1).Callable可以在人物结束后提供一个返回值,Runnable没有提供这个功能。
2).Callable中的call方法可以抛出异常,而Runnable的run方法不能抛出异常。

3).运行Callable可以拿到一个Future对象,表示异步计算的结果,提供了检查计算是否完成的方法。

需要注意的是,无论用那种方式实现了多线程,调用start方法并不意味着立即执行多线程代码,而是使得线程变为可运行状态。

run start的区别
start方法是启动一个线程,而线程中的run方法来完成实际的操作。

如果开发人员直接调用run方法,那么就会将这个方法当作一个普通函数来调用,并没有多开辟线程,开发人员如果希望多线程异步执行,则需要调用start方法。

sleep wait的区别
1.两者处理的机制不同,sleep方法主要是,让线程暂停执行一段时间,时间一到自动恢复,并不会释放所占用的锁,当调用wait方法以后,他会释放所占用的对象锁,等待其他线程调用notify方法才会再次醒来。
2.sleep是Threa的静态方法,是用来控制线程自身流程的,而wait是object的方法,用于进行线程通信。
3.两者使用的区域不同。sleep可以在任何地方使用,wait必须放在同步控制方法,或者语句块中执行。




synchronized notify wait的运用
synchronized关键字有两种用法,synchronized方法和synchronized语句块。
public synchronized void function(){}
synchronized(object){}
当某个资源被synchronized所修饰,线程1线程2等多个线程在共同请求这个资源,线程1先请求到,调用了对象的wait方法释放了对象的锁,此时线程2可以对这个对象进行访问,在工作结束时可以调用对象的notify方法,唤醒等待队列中正在等待的线程,此时被唤醒的线程将会再一次拿到对象锁,对对象进行操作。可以调用notifyAll方法,唤醒等待队列中的所有线程。


需要注意的是一个线程被唤醒不代表立即获取对象锁,必须等调用的线程对象的方法推出synchronized块释放对象锁后,被唤醒的进程才会获得对象锁。




以下为大家提供一个简单的代码实例:


分别用Runnable和Thread方法实现,展示各个方法的


实现Runnable实现多线程的方法


public class TestRunnable implements Runnable {
private int time=1;
private SourceA s;
private String id = "001";
public TestRunnable(SourceA s){
this.s = s;
}
public void setTime(int time) {
this.time = time;
}
@Override
public void run() {
try {
System.out.println("i will sleep"+ time);
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(s){
s.notify();
System.out.println("我唤醒了002!");
System.out.println("我存入了id"+id);
s.setSource(id);
}
}
}

继承Thread实现多线程的方法


public class TestThread extends Thread {
private int time = 1;
private SourceA s = null;
String id = "002";
public void setTime(int time) {
this.time = time;
}
public TestThread(SourceA s){
this.s = s ;
}
@Override
public void run() {
try {
System.out.println("i will sleep"+ time);
sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(s){
try {
System.out.println("我"+ id +"要进行等待了");
s.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("我被唤醒了");
System.out.println("我存入了id"+id);
s.setSource(id);
}
}
}

SourceA类代码


public class SourceA {
private List<String> list = new ArrayList<String>();
public synchronized void getSource(){
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
public synchronized void setSource(String id){
list.add(id);
}
}
Test测试类代码:

public void test(){
SourceA s = new SourceA();
TestThread tt = new TestThread(s);
TestRunnable tr = new TestRunnable(s);
Thread t = new Thread(tr);
System.out.println("调用线程1");
tt.start();
System.out.println("调用线程2");
t.start();
}

原文地址https://blog.csdn.net/wfa270/article/details/80858837
相关文章
|
5天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
18 2
|
7天前
|
数据可视化 Python
Python绘制基频曲线——实例解析与应用探讨
Python绘制基频曲线——实例解析与应用探讨
30 9
|
7天前
|
Java 调度
Java-Thread多线程的使用
这篇文章介绍了Java中Thread类多线程的创建、使用、生命周期、状态以及线程同步和死锁的概念和处理方法。
Java-Thread多线程的使用
|
4天前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
6 0
|
7天前
|
Java 数据处理 调度
Java中的多线程编程:从基础到实践
本文深入探讨了Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。首先,我们将了解什么是线程以及为何需要多线程编程。接着,文章将详细介绍如何在Java中创建和管理线程,包括继承Thread类、实现Runnable接口以及使用Executor框架等方法。此外,我们还将讨论线程同步和通信的问题,如互斥锁、信号量、条件变量等。最后,通过具体的示例展示了如何在实际项目中有效地利用多线程提高程序的性能和响应能力。
|
7天前
|
安全 算法 Java
Java中的多线程编程:从基础到高级应用
本文深入探讨了Java中的多线程编程,从最基础的概念入手,逐步引导读者了解并掌握多线程开发的核心技术。无论是初学者还是有一定经验的开发者,都能从中获益。通过实例和代码示例,本文详细讲解了线程的创建与管理、同步与锁机制、线程间通信以及高级并发工具等主题。此外,还讨论了多线程编程中常见的问题及其解决方案,帮助读者编写出高效、安全的多线程应用程序。
|
2月前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
2月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
56 6
|
19天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
23天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析

推荐镜像

更多
下一篇
无影云桌面