java中的多线程的示例

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

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

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()的所有线程。优先级最高的线程将首先运行。

 为了让学习变得轻松、高效,今天给大家免费分享一套Java教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要资料的欢迎加入学习交流群:9285,05736

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

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

相关文章

几个改变世界的java工具

Java的开源生态系统强大而健康&#xff0c;这是我们创建OSCON Java的主要原因之一。在过去的十年中&#xff0c;有几个项目已经超越了简单的采用&#xff0c;并在Java世界中发挥了主导作用&#xff0c;进入了软件开发的一般领域&#xff0c;有些甚至深入到用户的日常生活中。 …

java网络篇-tcp的握手和挥手!

package com.wql.test; public class Test6 { public static void main(String[] args) { test1(ErrorType.ERROR_2); } public static void test1(ErrorType type){ switch(type){ case ERROR_1: System.out.println("参数type"type",value"type.…

java enum枚举使用例子

package com.wql.test; public class Test6 { public static void main(String[] args) { test1(ErrorType.ERROR_2); } public static void test1(ErrorType type){ switch(type){ case ERROR_1: System.out.println("参数type"type",value"type.…

经典Java编程面试题分析

求职者参加企业面试是进入职场的一个必经阶段&#xff0c;企业的面试官一般都用哪些问题来考求职者呢&#xff1f;不少求职人员认为&#xff0c;面试官提题出的问都是随机的&#xff0c;没有一定的规律。其实面试官基于想多方面了解面试者的情况下&#xff0c;会通过特定的提问…

Java高级架构师需要掌握什么?

没有谁能够随随便便的就成功&#xff0c;也没有谁能够随随便便就成为一名高级Java架构师。在Java行业中&#xff0c;如果按照排序&#xff0c;Java架构师一定是排在最顶端的&#xff0c;所以成为高级Java架构师&#xff0c;也是得有高超的Java技能&#xff0c;并且还得有着一定…

Java的三种工厂模式

一、简单工厂模式 简单工厂的定义&#xff1a;提供一个创建对象实例的功能&#xff0c;而无须关心其具体实现。被创建实例的类型可以是接口、抽象类&#xff0c;也可以是具体的类 实现汽车接口 public interface Car { String getName(); } 奔驰类 public class Benz im…

浅谈Java中类加载机制

首先来了解一下jvm&#xff08;java虚拟机&#xff09;中的几个比较重要的内存区域&#xff0c;这几个区域在java类的生命周期中扮演着比较重要的角色&#xff1a; 方法区&#xff1a;在java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区…

Java学习四步曲,助你成长!

对于很多新手来说&#xff0c;可能JAVA的学习会很难。这种难度体现在语言的专业性、学习的不系统、条理的不清晰以及缺乏足够的耐心。实际上想要学习好JAVA&#xff0c;除了有足够的心理准备&#xff0c;还要有挑战JAVA终极四部曲的信心和勇气&#xff0c;那么四部曲是什么&…

Java里的 for (;;) 与 while (true),哪个更快?

在JDK8u的jdk项目下做个很粗略的搜索&#xff1a; 并没有差多少。 其次&#xff0c;for (;;) 在Java中的来源。个人看法是喜欢用这种写法的人&#xff0c;追根溯源是受到C语言里的写法的影响。这些人不一定是自己以前写C习惯了这样写&#xff0c;而可能是间接受以前写C的老师、…

Java中的null到底是什么?

让我们从下面的陈述开始&#xff1a; String xnull; 1. 这句话到底是什么意思? 回想一下什么是变量&#xff0c;什么是值。 一个常见的比喻是变量类似于一个盒子。 就像您可以使用一个框来存储某些东西一样&#xff0c;您也可以使用一个变量来存储一个值。 在声明变量时…

学习Java编程-Java Timezone类常见问题

今天遇到了一个比较有意思的问题&#xff0c;从服务器上封装好的java.sql.timestamp对象返回到本地客户端程序后与数据库中的时间相差了整整14个小时。因为跟客户的时差是14个小时&#xff0c;所以大体怀疑是时差问题。 所以计划在客户端程序执行之前首先设置默认的TimeZone: …

热门专业学习之关于java的一些知识

1. JAVASE 首先要学 JavaSE&#xff0c;这是毋庸置疑的。与此同时&#xff0c;和 JavaSE 的学习同步&#xff0c;建议大家研究一下数据结构与算法。 在 JavaSE 完成之后&#xff0c;可以试着完成一些小项目&#xff0c;同时关注一下设计模式的内容&#xff0c;不必强求自己能…

企业需求的Java程序员是什么样子的

选择学习Java编程​语言&#xff0c;大部分人还是冲着高薪就业去的&#xff0c;既然如此&#xff0c;就业是学习Java的最终目的&#xff0c;企业需要什么我们就学什么。 下面分析一下企业需要什么&#xff0c;这些也是我们在学习中应该着重关心的。当然&#xff0c;如果你是因…

如何提高Java代码的可重用性?

提高java代码可重用性有哪些方法措施&#xff0c;以下就讲解了三种关于提高java代码可重用性的措施&#xff0c;一起来了解一下吧~ 改写类的实例方法 通过类继承实现代码重用不是精确的代码重用技术&#xff0c;因此它并不是最理想的代码重用机制。继承总是带来一些多余的方法…

Java常见面试题之类的加载过程

程序员看似光鲜的就业前景面前&#xff0c;逃不过的是层层的面试&#xff0c;想要进前沿的大公司没有个五六七八面&#xff0c;是不可能滴&#xff01;而找工作的首个关卡就是笔试&#xff0c;想要获得高薪工作的小伙伴&#xff0c;先刷一波面试题吧&#xff01; 类加载过程主…

作为Java程序员,这些开源工具你应该要学习!

1. JIRA Atlassian的JIRA是当前敏捷开发领域最重要的工具之一。它用于错误跟踪&#xff0c;问题跟踪和项目管理。如果你遵循敏捷开发方法&#xff0c;例如Sprint和Scrum&#xff0c;那么你必须了解JIRA。它允许您创建Spring循环并跟踪软件开发的进度。 JIRA 是目前比较流行的基…

在Java编码中,如何减少bug数量

众所周知&#xff0c;Java编程语言在IT行业是企业中不可缺少的。不管&#xff0c;从Web应用到Android应用&#xff0c;这款语言已经被广泛用于开发各类应用及代码中的复杂功能。但在编写代码时&#xff0c;bug永远是困扰每一位从业者的头号大难题。今天就与大家分享几个关于减少…

为什么要学习Java EE?需要掌握哪些技能?

随着互联网的不断发展&#xff0c;Java作为一种古老的编程语言&#xff0c;全年仍占据着编程语言的榜首。那么编辑应该如何学习Java呢&#xff1f; 选择学习JavaEE或JavaME&#xff08;或者你想继续学习Java SE的深度&#xff0c;只要你喜欢&#xff0c;你就可以一直深入下去&…

Java Socket

什么是Socket Socket的概念很简单&#xff0c;它是网络上运行的两个程序间双向通讯的一端&#xff0c;既可以接收请求&#xff0c;也可以发送请求&#xff0c;利用它可以较为方便地编写网络上数据的传递。 所以简而言之&#xff0c;Socket就是进程通信的端点&#xff0c;Sock…

40个Java 多线程问题总结

1、多线程有什么用&#xff1f; 一个可能在很多人看来很扯淡的一个问题&#xff1a;我会用多线程就好了&#xff0c;还管它有什么用&#xff1f;在我看来&#xff0c;这个回答更扯淡。所谓"知其然知其所以然"&#xff0c;"会用"只是"知其然"&am…