vs如何写多线程_java中的多线程的示例

60c8ba685bb07ff9bbe8fc2a108e6371.png

在讨论多线程之前,让我们先讨论线程。线程是进程中轻量级的最小部分,可以与同一进程的其他部分(其他线程)并发运行。线程是独立的,因为它们都有独立的执行路径,这就是为什么如果一个线程中发生异常,它不会影响其他线程的执行。进程的所有线程共享公共内存。同时执行多个线程的过程称为多线程。

460885c779b5ddc6dfb7aca6e08b8548.png

让我们把讨论总结成以下几点:

1. 多线程的主要目的是同时执行程序的两个或多个部分,以最大限度地利用CPU时间。多线程程序包含两个或多个可以并发运行的部分。程序的每个这样的部分称为线程。

2. 线程是轻量级子进程,它们共享公共内存空间。在多线程环境中,受益于多线程的程序可以利用最大的CPU时间,使空闲时间保持在最小。

3.线程可以处于以下状态之一:

新-尚未启动的线程处于此状态。

RUNNABLE——在Java虚拟机中执行的线程处于这种状态。

阻塞——等待监视器锁的阻塞线程处于这种状态。

等待——正在无限期等待另一个线程执行特定操作的线程处于这种状态。

TIMED_WAITING—等待另一个线程执行某个操作长达指定等待时间的线程处于这种状态。

终止-已退出的线程处于此状态。

在给定的时间点上,线程只能处于一种状态。

多任务vs多线程vs多处理vs并行处理

如果您是java新手,您可能会对这些术语感到困惑,因为在我们讨论多线程时它们经常使用。让我们简单地谈一谈。

多任务处理: 同时执行多个任务的能力称为多任务处理。

多线程: 我们已经讨论过了。它是一个同时执行多个线程的进程。多线程也称为基于线程的多任务处理。

多处理: 它与多任务处理相同,但是在多处理中涉及多个cpu。另一方面,一个CPU参与多任务处理。

并行处理: 它是指在一个计算机系统中使用多个cpu。

在用Java创建线程

在Java中有两种创建线程的方法:

1)通过扩展Thread类。

2)通过实现Runnable接口。

在开始创建线程的程序(代码)之前,让我们先看看Thread类的这些方法。在下面的示例中,我们很少使用这些方法。

  • getName():用于获取线程的名称
  • getPriority():获取线程的优先级
  • isAlive():确定线程是否仍在运行
  • join():等待线程终止
  • run():线程的入口点
  • sleep():挂起线程一段时间
  • start():通过调用线程的run()方法来启动线程

方法1:通过扩展线程类创建线程Example 1:

class MultithreadingDemo extends Thread{  public void run(){  System.out.println("My thread is in running state.");  }  public static void main(String args[]){  MultithreadingDemo obj=new MultithreadingDemo();  obj.start();  } }

Output:

My thread is in running state.

Example 2:

class Count extends Thread{ Count() { super("my extending thread"); System.out.println("my thread created" + this); start(); } public void run() { try { for (int i=0 ;i<10;i++) { System.out.println("Printing the count " + i); Thread.sleep(1000); } } catch(InterruptedException e) { System.out.println("my thread interrupted"); } System.out.println("My thread run is over" ); }}class ExtendingExample{ public static void main(String args[]) { Count cnt = new Count(); try { while(cnt.isAlive()) { System.out.println("Main thread will be alive till the child thread is live"); Thread.sleep(1500); } } catch(InterruptedException e) { System.out.println("Main thread interrupted"); } System.out.println("Main thread's run is over" ); }}

输出:

my thread createdThread[my runnable thread,5,main]Main thread will be alive till the child thread is livePrinting the count 0Printing the count 1Main thread will be alive till the child thread is livePrinting the count 2Main thread will be alive till the child thread is livePrinting the count 3Printing the count 4Main thread will be alive till the child thread is livePrinting the count 5Main thread will be alive till the child thread is livePrinting the count 6Printing the count 7Main thread will be alive till the child thread is livePrinting the count 8Main thread will be alive till the child thread is livePrinting the count 9mythread run is overMain thread run is over

方法2:通过实现Runnable接口创建线程

一个简单示例

class MultithreadingDemo implements Runnable{  public void run(){  System.out.println("My thread is in running state.");  }  public static void main(String args[]){  MultithreadingDemo obj=new MultithreadingDemo();  Thread tobj =new Thread(obj);  tobj.start(); } }

输出:

My thread is in running state.

示例程序2:

观察这个程序的输出,并尝试理解这个程序中发生了什么。如果您已经理解了每个线程方法的用法,那么您应该不会遇到任何问题,请理解这个示例。

class Count implements Runnable{ Thread mythread ; Count() {  mythread = new Thread(this, "my runnable thread"); System.out.println("my thread created" + mythread); mythread.start(); } public void run() { try { for (int i=0 ;i<10;i++) { System.out.println("Printing the count " + i); Thread.sleep(1000); } } catch(InterruptedException e) { System.out.println("my thread interrupted"); } System.out.println("mythread run is over" ); }}class RunnableExample{ public static void main(String args[]) { Count cnt = new Count(); try { while(cnt.mythread.isAlive()) { System.out.println("Main thread will be alive till the child thread is live");  Thread.sleep(1500); } } catch(InterruptedException e) { System.out.println("Main thread interrupted"); } System.out.println("Main thread run is over" ); }}

输出:

my thread createdThread[my runnable thread,5,main]Main thread will be alive till the child thread is livePrinting the count 0Printing the count 1Main thread will be alive till the child thread is livePrinting the count 2Main thread will be alive till the child thread is livePrinting the count 3Printing the count 4Main thread will be alive till the child thread is livePrinting the count 5Main thread will be alive till the child thread is livePrinting the count 6Printing the count 7Main thread will be alive till the child thread is livePrinting the count 8Main thread will be alive till the child thread is livePrinting the count 9mythread run is overMain thread run is over

线程优先级

  • 线程优先级是决定一个线程如何对待其他线程的整数。
  • 线程优先级决定何时从一个正在运行的线程切换到另一个线程,进程称为上下文切换
  • 线程可以自动释放控制,准备运行的最高优先级线程是给定CPU的。
  • 一个线程可以被一个高优先级线程抢占,不管低优先级线程在做什么。当高优先级线程想要运行时,它就会运行。
  • 要设置线程的优先级,使用setPriority()方法,它是线程类的一个方法。
  • 我们可以使用MIN_PRIORITY、NORM_PRIORITY或MAX_PRIORITY来代替在整数中定义优先级。

方法: isAlive() 和 join()

  • 在所有实际情况下,主线程应该是最后一个完成,其他从主线程派生的线程也会完成。
  • 要知道线程是否已经完成,我们可以在线程上调用isAlive(),如果线程没有完成,它将返回true。
  • 另一种方法是使用join()方法,当从父线程调用该方法时,该方法使父线程等待子线程终止。
  • 这些方法是在Thread类中定义的。
  • 在上面的例子中,我们也使用了isAlive()方法。

同步

  • 多线程为程序引入了异步行为。如果一个线程正在写一些数据,那么另一个线程可能正在读取相同的数据。这可能会带来不一致。
  • 当两个或多个线程需要访问共享资源时,应该以某种方式让资源一次只被一个资源使用。实现这一点的过程称为同步。
  • 要实现同步行为,java有同步方法。一旦线程位于同步方法中,其他线程就不能调用同一对象上的任何其他同步方法。然后所有其他线程等待第一个线程从同步块中出来。
  • 当我们想要同步对一个不是为多线程访问而设计的类的对象的访问时,并且需要同步访问的方法的代码对我们不可用,在这种情况下,我们不能将synchronized添加到适当的方法中。在java中,我们对此有解决方案,将对这个类定义的方法(需要同步)的调用以以下方式放入同步块中。
Synchronized(object){ // statement to be synchronized}

线程间通信

我们有一些java线程可以彼此通信的方法。这些方法是wait()、notify()、notifyAll()。所有这些方法只能从同步方法中调用。

1)了解同步java有一个monitor的概念。监视器可以看作是一个只能容纳一个线程的盒子。一旦一个线程进入监视器,所有其他线程必须等待该线程退出监视器。

2) wait()告诉调用线程放弃监视器并进入睡眠状态,直到其他线程进入同一监视器并调用notify()。

3) notify()唤醒同一对象上调用wait()的第一个线程。

notifyAll()唤醒同一对象上调用wait()的所有线程。优先级最高的线程将首先运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab mex路径,使用matlab进行mex编译时的路径问题mexopts

matlab和vs 进行混合编程时总需要使用matlab编译mexFunction.cpp文件。这些文件免不了使用include下的*.h和lib下的*.lib文件。举matlab和vs 进行混合编程时总需要使用matlab编译mexFunction.cpp文件。这些文件免不了使用include下的*.h和lib下的*.lib文件。举例说明&#xff0…

hystrix应用 博客_用Hystrix保护您的应用程序

hystrix应用 博客在先前的帖子http://www.javacodegeeks.com/2014/07/rxjava-java8-java-ee-7-arquillian-bliss.html中&#xff0c;我们讨论了微服务以及如何使用&#xff08;RxJava&#xff09;的Reactive Extensions编排微服务。 但是&#xff0c;如果一项或多项服务因已停止…

艾默生变频器报警PHP,艾默生ct变频器报警ou 这个CT的变频器报警UU怎么解决?

1, 这个CT的变频器报警UU怎么解决&#xff1f;(1) 控制板Q1(15050026)坏。(2) 7840坏&#xff1a;在变频器通电时&#xff0c;用直流档&#xff0c;黑接5脚&#xff0c;红分别接6,7,8脚&#xff0c;值为2.5,2.5,5为正常&#xff0c;否则7840坏。(3) 小板坏&#xff1a;在变频器…

Project Reactor展开方法

最近&#xff0c;我的一位同事向我介绍了Project Reactor类型的expand运算符&#xff0c;在这篇文章中&#xff0c;我想介绍几种使用它的方式。 展开分页结果 考虑在名为City的模型上基于Spring Data的存储库&#xff1a; import org.springframework.data.jpa.repository.Jpa…

同时买票是怎么实现的_去巴黎玩怎么买地铁票最划算?| 巴黎最全交通攻略

次票、天票、机场票……傻傻分不清楚。不会法语怎么办&#xff1f;什么时候买有优惠&#xff1f;看这一篇全知道​​巴黎作为国际大都市&#xff0c;交通还是非常方便的。基本上80%的巴黎景点都能坐地铁到达&#xff0c;就在我们平常所说的小巴黎里。整个巴黎岛&#xff08;Ile…

php输入地址查询,PHP查询用户IP所在地址

原创内容&#xff0c;转载请注明出处&#xff1a;https://www.myzhenai.com.cn/post/3042.html关键词&#xff1a;IP所在地址 IP地址 PHP获取ip地址相关内容&#xff1a;获取IP所处位置的Shell代码&#xff1a;https://www.myzhenai.com.cn/post/2917.htmlWordPress获取当前浏览…

swig模板 PHP,如何使用nodejs前端模板引擎swig

这次给大家带来如何使用nodejs前端模板引擎swig&#xff0c;使用nodejs前端模板引擎swig的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。相对于jade&#xff0c;我还是更喜欢swig前端模板引擎&#xff0c;jade虽然语法简练高效了不少&#xff0c;但是…

redis是什么_什么是Redis?为什么我们要用Redis?

前言当结束Java和数据库的学习以后&#xff0c;你就会接触到Redis这个词&#xff0c;我第一次听到的时候脑海里就会浮现这两个问题&#xff1a;什么是Redis&#xff1f;为什么我们要用Redis&#xff1f;我了解完以后&#xff0c;写出来帮助大家能够更快的认识它。我们先来看它的…

性能php 教程,提高PHP性能效率的几个技巧

如何提高效率问题&#xff0c;往往同样的功能&#xff0c;不一样的代码&#xff0c;出来的效率往往大不一样。● 用单引号代替双引号来包含字符串&#xff0c;这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量&#xff0c;单引号则不会&#xff0c;注意&#xff1a;…

python from numpy import,python zeros()使用(from numpy import *)-Go语言中文社区

参考&#xff1a;############################################################函数zeros()在模块numpy中&#xff1a;from numpy import *help(zeros)该函数功能是创建给定类型的矩阵&#xff0c;并初始化为0参数简洁&#xff1a;shape&#xff1a;可以是int类型数据&#x…

sqlmap绕过d盾_Waf功能、分类与绕过

## 一. waf工作原理Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。常见的系统攻击分为两类&#xff1a;- 一是利用Web服务器的漏洞进行攻击&#xff0c;如DDOS攻击、病毒木马破坏等攻击&#xff1b;- 二是利用网页自身的安全漏洞进…

JUnit5 TestSuite替代

JUnit4具有TestSuite类来聚合多个测试。 这在JUnit 5中不可用。通常&#xff0c;通过套件中的一堆命名测试进行的测试发现有些糟透了。 但是&#xff0c;如果目标不是测试发现&#xff0c;而是不同测试类之间的资源共享&#xff0c;那么创建父对象是有意义的。 JUnit 5提供了N…

junit:junit_简而言之,JUnit:测试隔离

junit:junit作为顾问&#xff0c;我仍然经常遇到程序员&#xff0c;他们对JUnit及其正确用法的理解最多。 这使我有了编写多部分教程的想法&#xff0c;以从我的角度解释要点。 尽管存在一些有关使用该工具进行测试的好书和文章&#xff0c;但是也许可以通过本动手实践系列中的…

msflexgrid允许大选择_选择复式楼、跃层和别墅的装修业主如何做好家里的楼梯...

点击上面蓝色字体关注&#xff01;装修图例 | 别墅装修 | 装潢装饰 | 样板楼梯 | 装修设计很多复式或者别墅的房子&#xff0c;楼梯是不可缺少的建筑&#xff0c;大部分楼梯是连接客厅以及卧室的&#xff0c;很多朋友都选择在楼梯上面铺地板&#xff0c;木地板的改装空间大&…

mysql 查询 系统字段 自然日_Mysql查询用户留存/留存率问题用户n日(内)留存、某日新增用户n日(内)留存...

Mysql查询用户留存/留存率语法计算某日的客户在第n日再次出现的概率--用户n日留存率。计算某日的客户在某个时间段内再次出现的概率--用户n日内留存率。计算某日新增的用户在第n日再次出现的概率--新用户n日留存率。计算某日新增的用户在某个时间段内再次出现的概率--新用户n日…

ajax 示例_通过示例了解挥发

ajax 示例我们已经花了几个月的时间来稳定Plumbr中的锁定检测功能 。 在此期间&#xff0c;我们遇到了许多棘手的并发问题。 许多问题是独特的&#xff0c;但是一种特殊类型的问题一直反复出现。 您可能已经猜到了–滥用volatile关键字。 我们已经发现并解决了许多问题&#x…

springboot 多线程_redis官方推荐:SpringBoot用这个,一键多线程

Lettuce是一个可伸缩的线程安全的Redis客户端&#xff0c;提供了同步&#xff0c;异步和响应式使用方式。 如果多线程避免阻塞和事务操作(如BLPOP和MULTI / EXEC)&#xff0c;则多个线程可共享一个连接。 Lettuce使用通信使用netty。 支持先进的Redis功能&#xff0c;如Sentine…

oracle查询最高一条记录,oracle 查询已有记录,上一条记录,下一条记录

oracle可以使用 lead、lag 函数来查询已有记录的下一条、上一条记录。表结构如下&#xff1a;如要查询Staffno是6-1102的前一条记录select * from staff where staff_no(select c.p from (select staff_no,lag(staff_no,1,0) over (order by staff_no) as p from staff) c wh…

使用Maven进行增量构建

这是2020年&#xff0c;如果您要启动任何新的基于Java的项目&#xff0c;则应优先选择gradle&#xff0c;但由于某些原因&#xff0c;如果您仍然对Maven感兴趣&#xff0c;那么您可能会发现这篇文章有用。 Maven Java / scala编译器插件对增量编译提供了不错的支持&#xff0c…

php删除菜单栏,如何删除WordPress站点健康状态面板和菜单项

下面由WordPress教程栏目给大家介绍删除WordPress站点健康状态面板和菜单项的方法&#xff0c;希望对需要的朋友有所帮助&#xff01;删除 WordPress 站点健康状态面板和菜单项WordPress站点健康功能始于 5.2 版&#xff0c;如不想显示这玩意&#xff0c;可以使用本文的方法删除…