首页 > 后端开发 > 正文

Java如何实现线程的暂停和重新启用?求大神

2024-06-23 23:07:43 | 我爱编程网

小编今天整理了一些Java如何实现线程的暂停和重新启用?求大神相关内容,希望能够帮到大家。

本文目录一览:

Java如何实现线程的暂停和重新启用?求大神

Java如何实现线程的暂停和重新启用?求大神

JAVA中线程开始有start方法,暂停用sleep(time)方法,线程停止用stop方法,线程等待wait方法,java 中没有线程重启一说,只能说线程唤醒notifyAll()或是notify方法,前一个notifyAll()方法是唤醒所有的已休眠或是等待状态下的线程。具体的一种参数请参照JDK文档。

Java中的线程的

生命周期

大体可分为5种状态。如下:

1.新建(NEW):新创建了一个线程对象。

2.可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行

线程池

中,等待被线程调度选中,获取cpu 的使用权 。

3.运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。

4.阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:

(一).等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。

(二).同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。

(三).其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

5.死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

Java如何实现线程的暂停和重新启用?求大神

如何实现一个java 程序运行后,可以检测到另外一个jar 程序在运行中,如果这个jar程序关闭了, 就重新启动它

考虑使用 Socket 连接进行跨进程通信。

被监视进程做 Server,监视进程做 Client。

Client 每隔一段时间给 Server 一个信号,Server 做出响应。如果 Client 找不到 Server 或者 Server 不响应就使用 java 或者 javaw 命令重启被监视进程。

具体策略还得细化,大体思路如此吧。

Java如何实现线程的暂停和重新启用?求大神

JAVA有哪些实用的基本语法

我爱编程网(https://www.52biancheng.com)小编还为大家带来JAVA有哪些实用的基本语法的相关内容。

. 表达式语句

int k, i=3, j=4;�

k=i+j;�

System.out.println(〃k=〃+k);

2. 复合语句

class Block {�

public static void main(String args〔〕) {�

int k, i=3, j=4;�

k=i+j;�

System.out.println(〃k=〃+k);�

{�

float f;�

f=j+4.5F;�

i++;�

System.out.println(〃f=〃+f);�

}�

System.out.println(〃i=〃+i);�

}�

}

选择语句

利用选择语句结构可以根据条件控制程序流程,改变程序执行的顺序。

if语句

if语句的语法格式为:

if (条件表达式)�

s1语句;

这是最简单的单分支结构。条件表达式的值为true,就执行s1语句,否则就忽略s1语句。s1语句可以是复合语句。

if…else语句

if语句通常与else语句配套使用,形成二分支结构。它的语法格式为:

if (条件表达式)�

s1语句;�

else�

s2语句;

当条件表达式的值为true,就执行s1语句,忽略else和s2语句;条件表达式的值为false,程序忽略s1语句,执行else后面的s2语句。s1和s2都可以是复合语句。

if…else复合结构

对于复杂的情况,可以嵌套使用if…else语句。它的语法格式为:

if (条件表达式1)�

s1语句;�

else if (条件表达式2)�

s2语句;�

else�

s3语句;

在这里依次计算条件表达式,如果某个条件表达式的值为true,就执行它后面的语句,其余部分被忽略;所有表达式的值都为false,就执行最后一个else后的s3语句。s1、s2和s3都可以是复合语句。

switch开关语句

虽然嵌套的条件语句可实现多个分支处理,但嵌套太多时容易出错和混乱,这时可以使用开关语句switch处理。实际上开关语句switch也是一种if…else结构,不过它使你在编程时很容易写出判断条件,特别是有很多条件选项的时候。

开关语句switch的语法格式:

switch (表达式) {�

case 常量1:�

语句1;�

break;

case 常量2:�

语句2;�

break;�

......�

default:�

语句n;�

}

其中switch、case、default是关键字,default子句可以省略。开关语句先计算表达式,然后将表达式值与各个常量比较,如果表达式值与某个常量相等,就执行该常量后面的语句;如果都不相等,就执行default下面的语句。如果无default子句,就什么都不执行,直接跳出开关语句。

使用开关语句时,注意以下几点:

? case后面的常量必须是整数或字符型,而且不能有相同的值;

? 通常在每一个case中都应使用break语句提供一个出口,使流程跳出开关语句。否则,在第一个满足条件case后面的所有语句都会被执行,这种情况叫做落空。

循环语句

循环可使程序根据一定的条件重复执行某一部分程序代码,直到满足终止循环条件为止。

Java中提供的循环语句有: 确定次数循环(for)、条件循环(while)、先执行后判定循环(do)。

for循环语句

如果希望程序的一部分内容按固定的次数重复执行,通常可以使用for循环。for循环采用一个计数器控制循环次数,每循环一次计数器就计数,直到完成给定的循环次数为止。

for循环的语法格式为:

for (表达式1; 表达式2; 表达式3)�

循环体

其中表达式1可以给出计数器的初值,是一个赋值语句;表达式2指出循环结束条件,是一个逻辑表达式;表达式3指出计数器每次的增量,是一个赋值语句。

注意: 计数器可在for语句之前定义,也可在循环括号中定义。计数器增量为1时常写成增量运算的形式,以加快运算速度。根据需要,增量可以大于或小于1。增量计算也可以放在循环体中进行,即把表达式3移到循环体内的适当位置,原位置为空。

使用循环语句时常常会遇到死循环的情况,也就是无限制地循环下去。所以在使用for循环时,要注意初值、终值和增量的搭配。终值大于初值时,增量应为正值,终值小于初值时,增量应为负值。编程时必须密切关注计数器的改变,这是实现正常循环避免陷入死循环的关键。

while循环语句

while循环不像for循环那么复杂,while循环只需要一个条件判断语句,便可以进行循环操作。

while循环的语法格式为:

while (条件表达式) �

循环体

其中while是关键字。每次循环之前都要计算条件表达式,其值为true时,就执行一次循环体中的语句,然后再计算条件表达式,决定是否再次执行循环体中的语句;如果条件表达式的值为false时,就跳出循环体,执行循环体下面的语句。

注意: while循环中的条件表达式是逻辑表达式,所以循环体中一定要有改变条件表达式值的语句,使条件表达式的值有机会变为false,否则会陷入死循环。

do…while循环语句

do…while循环与while循环相反,是先执行循环体中的语句,再计算while后面的条件表达式,若条件表达式值为false则跳出循环;否则继续下一轮循环。

有些情况下,不管条件表达式的值是为true还是false,都希望把指定的语句至少执行一次,那么就应使用do…while循环。

do…while循环的语法格式为:

do {�

循环体�

} while (条件表达式);

其中do、while是关键字。程序首先执行do下面的循环体,然后计算while后面条件表达式的值,如果其值为true,则重复执行循环体;否则,就结束循环。

与while循环相同,do循环在循环体中也一定要有改变条件表达式值为false的语句,否则会陷入死循环。do…while循环控制并不是很常用,但有时却非常重要,使用时特别注意不要忘记了while语句结尾处的分号“;”。

循环语句嵌套

ex:做个例子 是累计求和的。

public class Sum1 {�

public static void main(String args〔〕) {�

int n=10, sum=0;�

while (n>0) {�

sum=0;�

for (int i=1; i<=n; i++)�

sum+=i;�

System.out.println(〃前〃+n+〃个数的总和为: 〃+sum);�

n--;�

}�

}�

}

循环语句小结

一个循环一般应包括4部分内容。

(1) 初始化部分: 用来设置循环的一些初始条件,计数器清零等。

(2) 循环体部分: 这是反复被执行的一段代码,可以是单语句,也可以是复合语句。

(3) 迭代部分: 这是在当前循环结束,下一次循环开始时执行的语句,常用来使计数器加1或减1。

(4) 终止部分: 通常是一个布尔表达式,每一次循环要对该表达式求值,以验证是否满足循环终止条件。

跳转语句

跳转语句可以无条件改变程序的执行顺序。Java支持3种跳转语句: break、continue和return。

break语句

break语句提供了一种方便的跳出循环的方法。使用break语句可以立即终止循环,跳出循环体,即使循环没有结束也如此。

break语句的使用示例,输出结果如图3.10所示。

class B {�

public static void main(String args〔〕) {�

boolean test=true;�

int i=0;�

while (test) {�

i=i+2;�

System.out.println(〃i=〃+i);�

if (i>=10)�

break;�

}�

System.out.println(〃 i为〃+i+〃时循环结束〃);�

}�我爱编程网

}

带标号的break语句

标号是标记程序位置的标识符。break语句只能跳转到循环语句下面的第一条语句上,而带标号的break语句可直接跳转到标号处。正常的break只退出一重循环,如果要退出多重循环,可以使用带标号的break语句。它的语法格式为:

标识符:�

…�

break 标识符;

做个例子说明

运行该工程,正常情况下可从键盘接受16个输入字符,但当输入b按回车时,break lab1语句就会结束二重循环。

class B1 {�

public static void main(String args〔〕) throws java.io.IOException {�

char ch;��

lab1: // 此处为标号标识符�

for (int i=0; i<4; i++)�

for (int j=0; j<4; j++) {�

ch=(char)System.in.read();�

System.in.skip(2);�

if (ch==′b′)�

break lab1;//跳到标号标识符处�

if (ch==′c′)�

System.out.println(〃继续〃);

}�

System.out.println(〃结束两重循环〃);�

}�

}

continue语句

continue语句只能用在循环结构中,它跳过循环体中尚未执行的语句,重新开始下一轮循环,从循环体第一个语句开始执行。

下面的可以输出1~9中除6以外所有偶数的平方值

class C2 {�

public static void main(String args〔〕) {�

for (int i=2;i<=9;i+=2) {�

if (i==6)�

continue; �

System.out.println(i+〃 的平方 = 〃+i*i); }�

}�

}

带标号的continue语句

Java也支持带标号的continue语句,它通常用在嵌套循环的内循环中,可以用标号标出想跳到哪一条语句继续重复执行程序。其语法格式为:

标识符:�

…�

continue 标识符;

带标号的continue语句的使用

class C3{�

public static void main(String args〔〕) {�

lab1:�

for (int i=1; i<=3; i++)�

for (int j=1; j<=3; j++) {�

System.out.println(〃i:〃+i+〃 j:〃+j);�

if (i+j>3) {�

System.out.println(〃Continue〃);�

continue lab1;�

}�

System.out.println(〃i=〃+i+〃 j=〃+j);�

}�

}�

}

求100~200间的所有素数。用嵌套的for循环做

public class Find {�

public static void main(String args〔〕) {�

System.out.println(〃 ** 100~200间的所有素数 **〃);�

int n=0;��

outer:�

for (int i=101; i<200; i+=2) {�

int k=15;�

for (int j=2; j<=k; j++)�

if (i%j==0)�

continue outer;�

System.out.print(〃 〃+i);�

n++;�

if (n<10)�

continue;

System.out.println();�

n=0;�

}�

System.out.println();�

}�

}

return语句

return语句用于方法的返回上,当程序执行到return语句时,终止当前方法的执行,返回到调用这个方法的语句。return语句通常位于一个方法体的最后一行,有带参数和不带参数两种形式,带参数形式的return语句退出该方法并返回一个值。

当方法用void声明时,说明不需要返回值(即返回类型为空),应使用不带参数return语句。不带参数的return语句也可以省略,当程序执行到这个方法的最后一条语句时,遇到方法的结束标志}就自动返回到调用这个方法的程序中。

带参数的return语句格式为:

return 表达式;

当程序执行到这个语句时,首先计算“表达式”的值,然后将表达式的值返回到调用该方法的语句。返回值的数据类型必须与方法声明中的返回值类型一致,可以使用强制类型转换来使类型一致。

带参数的return语句的使用

class CircleArea {�

final static double PI=3.14159;�

public static void main(String args〔〕) {�

double r1=8.0, r2=5.0;�

System.out.println(〃半径为〃+r1+〃的圆面积=〃+area(r1));�

System.out.println(〃半径为〃+r2+〃的圆面积=〃+area(r2));�

}�

static double area(double r) {�

return (PI*r*r);�

}�

}

以上就是我爱编程网小编为大家带来的内容了,想要了解更多相关信息,请关注我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“Java如何实现线程的暂停和重新启用?求大神”相关推荐
java如何实现重启docker中运行的java项目
java如何实现重启docker中运行的java项目

java如何实现重启docker中运行的java项目java实现重启docker中运行的java项目步骤如下:1、准备一个简单的javaweb程序,打成jar包之后上传到服务器上。2、创建Dockerfile文件3、生成并启动镜像。4、日志查看,利用java查看实时日志。如何使用Docker进行Java开发1、java项目开发,假定已有一个java项目能够编译成j

2024-04-19 08:19:15
请教大神,比如说我写了一个java程序,我想让tomcat启动时自动去执行这个java程序。如何实现?
请教大神,比如说我写了一个java程序,我想让tomcat启动时自动去执行这个java程序。如何实现?

请教大神,比如说我写了一个java程序,我想让tomcat启动时自动去执行这个java程序。如何实现?java有个Listener!随tomcat启动而调用自己写的方法!也可以循环调用!就是每过几小时掉用自己的方法web.xml&lt;listener&gt;&lt;listener-class&gt;com.function.SysContextListener&lt;/listene

2024-04-12 14:03:09
用Java实现多线程有哪些途径?
用Java实现多线程有哪些途径?

用Java实现多线程有哪些途径?1,创建Thread类的子类在这个途径中,用户程序需要创建自己的Thread类的子类,并在子类中重新定义自己的run()方法,这个run()方法中包含了用户线程的操作。这样在用户程序需要建立自己的线程时,它只需要创建一个已定义好的Thread子类的实例就可以了。例:publicclassTestThread{...(中间的就不写了)}c

2024-07-01 21:35:40
如何用java实现一个计时器?
如何用java实现一个计时器?

JAVA计时器求大神//声明图形界面元素private JLabel lab_time;private JButton but_start;private JButton but_end;private JButton but_reset;//初始化界面元素,布局,注册时间监听器setLayout(null);setSize(400, 300);lab_time = new JLabel("

2024-06-18 13:44:35
请教大神Linux下编写shell脚本,利用javac如何编译完整的java工程
请教大神Linux下编写shell脚本,利用javac如何编译完整的java工程

请教大神Linux下编写shell脚本,利用javac如何编译完整的java工程#!/bin/sh#DefinesomeconstantsONSSERVER=ONSServerPROJECT_PATH=/root/iot-oidJAR_PATH=$PROJECT_PATH/libBIN_PATH=$PROJECT_PATH/binSRC_PATH=$PROJECT_PAT

2024-05-07 13:54:58
RxJava怎么实现多个线程同时执行,怎么实现retryWhen
RxJava怎么实现多个线程同时执行,怎么实现retryWhen

RxJava怎么实现多个线程同时执行,怎么实现retryWhen在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多,具体如下。(1)synchronized关键字在Java中内置了语言级的同步原语synchronized关键字,其在多线程条件下实现了对共享资源的同步访问。根据synchronized关键字修饰的对象不同可以分

2024-04-13 05:00:28
如何用java程序实现上传文件到指定的URL地址
如何用java程序实现上传文件到指定的URL地址

如何用java程序实现上传文件到指定的URL地址参考代码如下:importjava.io.*;/***复制文件夹或文件夹*/publicclassCopyDirectory{//源文件夹staticStringurl1="f:/photos";//目标文件夹staticStringurl2="d:/tempPhotos";publicstaticv

2024-04-07 04:15:03
如何启用firefox对java的支持
如何启用firefox对java的支持

如何启用firefox对java的支持1、访问oracle官方站点下载最新版本的java的jdk安装包,因为java8安全隐患,火狐将其禁用,请尽量下载使用最新版本;2、安装jdk安装包,完成安装后,可能需要重启系统以让jdk生效。3、开启火狐浏览器,选项-&gt;附加组件管理,打开插件找到java选项,开启所有权限即可。火狐java已禁用,如何启用?尊敬的用户,您

2024-05-03 08:06:26