2024-06-23 23:07:43 | 我爱编程网
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()方法,则该线程结束生命周期。死亡的线程不可再次复生。
考虑使用 Socket 连接进行跨进程通信。
被监视进程做 Server,监视进程做 Client。
Client 每隔一段时间给 Server 一个信号,Server 做出响应。如果 Client 找不到 Server 或者 Server 不响应就使用 java 或者 javaw 命令重启被监视进程。
具体策略还得细化,大体思路如此吧。
我爱编程网(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);�
}�
}
java如何实现重启docker中运行的java项目java实现重启docker中运行的java项目步骤如下:1、准备一个简单的javaweb程序,打成jar包之后上传到服务器上。2、创建Dockerfile文件3、生成并启动镜像。4、日志查看,利用java查看实时日志。如何使用Docker进行Java开发1、java项目开发,假定已有一个java项目能够编译成j
请教大神,比如说我写了一个java程序,我想让tomcat启动时自动去执行这个java程序。如何实现?java有个Listener!随tomcat启动而调用自己写的方法!也可以循环调用!就是每过几小时掉用自己的方法web.xml<listener><listener-class>com.function.SysContextListener</listene
用Java实现多线程有哪些途径?1,创建Thread类的子类在这个途径中,用户程序需要创建自己的Thread类的子类,并在子类中重新定义自己的run()方法,这个run()方法中包含了用户线程的操作。这样在用户程序需要建立自己的线程时,它只需要创建一个已定义好的Thread子类的实例就可以了。例:publicclassTestThread{...(中间的就不写了)}c
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("
请教大神Linux下编写shell脚本,利用javac如何编译完整的java工程#!/bin/sh#DefinesomeconstantsONSSERVER=ONSServerPROJECT_PATH=/root/iot-oidJAR_PATH=$PROJECT_PATH/libBIN_PATH=$PROJECT_PATH/binSRC_PATH=$PROJECT_PAT
RxJava怎么实现多个线程同时执行,怎么实现retryWhen在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多,具体如下。(1)synchronized关键字在Java中内置了语言级的同步原语synchronized关键字,其在多线程条件下实现了对共享资源的同步访问。根据synchronized关键字修饰的对象不同可以分
如何用java程序实现上传文件到指定的URL地址参考代码如下:importjava.io.*;/***复制文件夹或文件夹*/publicclassCopyDirectory{//源文件夹staticStringurl1="f:/photos";//目标文件夹staticStringurl2="d:/tempPhotos";publicstaticv
如何启用firefox对java的支持1、访问oracle官方站点下载最新版本的java的jdk安装包,因为java8安全隐患,火狐将其禁用,请尽量下载使用最新版本;2、安装jdk安装包,完成安装后,可能需要重启系统以让jdk生效。3、开启火狐浏览器,选项->附加组件管理,打开插件找到java选项,开启所有权限即可。火狐java已禁用,如何启用?尊敬的用户,您
2023-12-21 16:29:16
2023-12-24 20:21:11
2024-04-13 17:18:48
2024-04-09 17:44:01
2024-04-04 05:10:44
2024-03-31 15:14:06