java多线程实现方式
一、什么是线程?
线程:程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位。
多线程:单个程序中同时运行多个线程完成不同的工作,称为多线程。
特点:
1)轻量级的进程,程序运行流中可执行的最小单元,线程不拥有系统资源,多个线程共享进程拥有的资源。
2)一个线程可以创建另外一个线程,多个线程可以并发执行。
3)多个线程在系统运行中抢占资源,会出现间断性,我们看到的是并行执行,其实在有先后顺序的。
4)一个进程至少包含一个线程,即主线程。
二、线程有哪些状态?
线程具有:新建,就绪,运行,阻塞,终止五种状态。
①新建:线程被创建,没有执行任何方法,如,Thread th = new Thread()。
②就绪:当调用线程的start方法时,就会触发线程状态变更为就绪态,等待cpu来调用。处于就绪态的线程才会被cpu调度,单cpu不是立即执行它。
③运行:当cpu发起对此线程调用时,它就进入了运行态。
④阻塞:当线程由于某种原因,不再拥有cpu使用权,它就会被阻塞。
阻塞有以下几种情况:
1)sleep(long mills):参数为毫秒数,使线程在指定的时间内进入阻塞,时间一过,进入就绪态。
2)suspend() 和 resume():suspend会让线程挂起,必须执行resume进行线程的恢复。
3)yield():与sleep()类似,但是不能由用户指定暂停多长时间,只能出让机会给同优先级的线程,且不进入阻塞。如同排队,前面的人和后面的人交换位置,但是还处在队伍中。
4)wait() 和 notify():wait() 使线程进入阻塞状态,有两种形式,一种指定毫秒数,另一种无参。前者可通过notify()唤起或者超过指定时间自动恢复;后者必须通过notify()唤起。
5)同步阻塞:等待同步锁资源。多线程竞争同一个资源时,只能一个线程获得锁,其它的线程要等待。
⑤终止:线程执行完毕,或者出现异常,线程结束。
三、如何创建线程?
java线程的实现方式有三种:继承Thread类、实现Runnable接口,使用Callable和FutureTask(可以有返回值)
1、通过集成Thread类,覆写run()方法
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
MyThread th1 = new MyThread();
MyThread th2 = new MyThread();
th1.start();
th2.start();
}
}
输出:main
Thread-1 0
Thread-0 0
Thread-1 1
Thread-1 2
......
线程要实现的逻辑写在run方法中,通过执行线程的start()方法,使线程进入就绪状态,等待CPU分配资源。
可以看到两个线程并行执行,且随机获得CPU。
2、试过实现Runnable接口,实现run()方法
class MyThread implements Runnable {
@Override
public void run() {
for (int i = 0; i
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
MyThread th = new MyThread();
Thread t1 = new Thread(th);
Thread t2 = new Thread(th);
t1.start();
t2.start();
}
}
输出:main
Thread-0 0
Thread-0 1
Thread-1 0
Thread-0 2
......
通过将MyThread实例传入Thread构造方法实例化Thread,调用Thread的start方法,启动线程。
ps:继承Thread和实现Runnable接口有什么区别呢?
1:前者为单继承,有局限性,但接口的方式可以实现多个。
2:后者可以实现资源共享。
多线程编程中,强烈建议使用Runnable
3、使用Callable和Future接口创建线程。
具体是创建Callable接口的实现类,并实现clall()方法。
并使用FutureTask类来包装Callable实现类的对象,且以此FutureTask对象作为Thread对象的target来创建线程。
class MyCallable implements Callable
@Override
public Integer call() throws Exception {
return 1;
}
}
public class ThreadDemo {
public static void main(String[] args) {
Callable
FutureTask
Thread thread = new Thread(ft);//将FutureTask传入Thread构造,实例化线程
thread.start();//线程启动
Integer result = ft.get();//获取返回值
System.out.println(result);
}
}
1)实现Callable接口中的call()方法,这个是线程要执行的逻辑。
2)FutureTask的get()方法会一直阻塞,直到call()方法执行完毕取到返回值。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

Java是热门编程语言,适合初学者和经验丰富的开发者学习。本教程从基础概念出发,逐步深入讲解高级主题。安装Java开发工具包后,可通过创建简单的“Hello,World!”程序实践编程。理解代码后,使用命令提示符编译并运行程序,控制台上将输出“Hello,World!”。学习Java开启了编程之旅,随着掌握程度加深,可创建更复杂的应用程序。

Spring Boot简化了可靠,可扩展和生产就绪的Java应用的创建,从而彻底改变了Java开发。 它的“惯例惯例”方法(春季生态系统固有的惯例),最小化手动设置
