java
如何关闭java线程?
一、如何关闭java线程?
百度搜索圈T社区 免费行业视频教程 www.aiquanti.com
终止线程的三种方法
1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
3. 使用interrupt方法中断线程。
1. 使用退出标志终止线程
当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){……}来处理。但要想使while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出。下面给出了一个利用退出标志终止线程的例子。
package chapter2;
public class ThreadFlag extends Thread
{
public volatile boolean exit = false;
public void run()
{
while (!exit);
}
public static void main(String[] args) throws Exception
{
ThreadFlag thread = new ThreadFlag();
thread.start();
sleep(5000); // 主线程延迟5秒
thread.exit = true; // 终止线程thread
thread.join();
System.out.println("线程退出!");
}
}
在上面代码中定义了一个退出标志exit,当exit为true时,while循环退出,exit的默认值为false.在定义exit时,使用了一个Java关键字volatile,这个关键字的目的是使exit同步,也就是说在同一时刻只能由一个线程来修改exit的值,
2. 使用stop方法终止线程
使用stop方法可以强行终止正在运行或挂起的线程。我们可以使用如下的代码来终止线程:
thread.stop();
虽然使用上面的代码可以终止线程,但使用stop方法是很危险的,就象突然关闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,因此,并不推荐使用stop方法来终止线程。
3. 使用interrupt方法终止线程
使用interrupt方法来终端线程可分为两种情况:
(1)线程处于阻塞状态,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}来判断线程是否被中断。
在第一种情况下使用interrupt方法,sleep方法将抛出一个InterruptedException例外,而在第二种情况下线程将直接退出。下面的代码演示了在第一种情况下使用interrupt方法。
package chapter2;
public class ThreadInterrupt extends Thread
{
public void run()
{
try
{
sleep(50000); // 延迟50秒
}
catch (InterruptedException e)
{
System.out.println(e.getMessage());
}
}
public static void main(String[] args) throws Exception
{
Thread thread = new ThreadInterrupt();
thread.start();
System.out.println("在50秒之内按任意键中断线程!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("线程已经退出!");
}
}
上面代码的运行结果如下:
在50秒之内按任意键中断线程!
sleep interrupted
线程已经退出!
在调用interrupt方法后, sleep方法抛出异常,然后输出错误信息:sleep interrupted.
注意:在Thread类中有两个方法可以判断线程是否通过interrupt方法被终止。一个是静态的方法interrupted(),一个是非静态的方法isInterrupted(),这两个方法的区别是interrupted用来判断当前线是否被中断,而isInterrupted可以用来判断其他线程是否被中断。因此,while (!isInterrupted())也可以换成while (!Thread.interrupted())。
二、java如何实现进程间的通信?
客户端与客户端不能直接通信吧,客户端需要与服务器端建立tcp链接。所以两个客户端需要通过服务器连接,你可以建立两个客户端到服务器的长链接,通过服务器转发一个客户端对另一个客户端的信息。
websocket这方面比较方便,非常适合用于聊天室的开发。还可以根据原始邮件的方式,客户端1将信息发给服务器并且存储到一个数据库中,等到客户端2链接服务器时,服务器判断数据库中是否有信息,有的话推送给客户端2,这种方式是非及时通信的。
websocket是即时通信的应用层协议,传输层其实就是tcp长链接。
三、线程间通信有哪些方式?
多线程通信的方法主要有以下三种:
1.全局变量
进程中的线程间内存共享,这是比较常用的通信方式和交互方式。
注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。
2.Message
消息机制常用的Message通信的接口主要有两个:PostMessage和PostThreadMessage,
PostMessage为线程向主窗口发送消息。而PostThreadMessage是任意两个线程之间的通信接口。
2.1.PostMessage()
函数原型:
B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
参数:
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND.BROADCAST
:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口。
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样。
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。
MS还提供了SendMessage方法进行消息间通讯,SendMessage(),他和PostMessage的区别是:
SendMessage是同步的,而PostMessage是异步的。SendMessage必须等发送的消息执行之后,才返回。
2.2.PostThreadMessage()
PostThreadMessage方法可以将消息发送到指定线程。
函数原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam, LPARAM lParam);
参数除了ThreadId之外,基本和PostMessage相同。
目标线程通过GetMessage()方法来接受消息。
注:使用这个方法时,目标线程必须已经有自己的消息队列。否则会返回ERROR_INVALID_THREAD_ID错误。可以用
PeekMessage()给线程创建消息队列。
3.CEvent
对象CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步。
四、线程间通信方式有哪些?
线程间通信就是通过全局变量啊,线程之间没有“通信”的说法吧,不管有几个线程,它们都是在同一个进程地址空间内,都共享同样的内存空间,所以“通信”的说法才多见于进程之间,因为不同的进程才是不同的内存地址空间。
进程内的变量每个线程都是可以访问的,是共享的,但是线程之间没有固定的执行顺序,为避免时序上的不同步问题,所以线程之间才会需要同步机制。线程之间的重点就是同步机制。
五、Java线程池?
多线程是为了能够让计算机资源合理的分配,对于处理不同的任务创建不同的线程进行处理,但是计算机创建一个线程或者销毁一个线程所花费的也是比较昂贵的,有时候需要同时处理的事情比较多,就需要我们频繁的进行线程的创建和销毁,这样花费的时间也是比较多的。为了解决这一问题,我们就可以引用线程池的概念。
所谓线程池就是将线程集中管理起来,当需要线程的时候,可以从线程池中获取空闲的线程,这样可以减少线程的频繁创建与销毁,节省很大的时间和减少很多不必要的操作。
在java中提供了ThreadPoolExecutor类来进行线程的管理,这个类继承于AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口,我们可以使用ThreadPoolExecutor来进行线程池的创建。
在ThreadPoolExecutor的构造方法中,有多个参数,可以配置不同的参数来进行优化。这个类的源码构造方法为:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)其中每个参数代表的意义分别为:
corePoolSize : 线程池中的核心线程数量,当线程池中当前的线程数小于这个配置的时候,如果有一个新的任务到来,即使线程池中还存在空闲状态的线程,程序也会继续创建一个新的线程放进线程池当中
maximumPoolSize: 线程池中的线程最大数量
keepAliveTime:当线程池中的线程数量大于配置的核心线程数量(corePoolSize)的时候,如果当前有空闲的线程,则当这个空闲线程可以存在的时间,如果在keepAliveTime这个时间点内没有新的任务使用这个线程,那么这个线程将会结束,核心线程不会结束,但是如果配置了allowCoreThreadTimeOut = true,则当空闲时间超过keepAliveTime之后,线程也会被结束调,默认allowCoreThreadTimeOut = false,即表示默认情况下,核心线程会一直存在于线程池当中。
unit : 空闲线程保持连接时间(keepAliveTime)的时间单位
workQueue:阻塞的任务队列,用来保存等待需要执行的任务。
threadFactory :线程工厂,可以根据自己的需求去创建线程的对象,设置线程的名称,优先级等属性信息。
handler:当线程池中存在的线程数超过设置的最大值之后,新的任务就会被拒绝,可以自己定义一个拒绝的策略,当新任务被拒绝之后,就会使用hander方法进行处理。
在java中也提供了Executors工具类,在这个工具类中提供了多个创建线程池的静态方法,其中包含newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor等。但是他们每个方法都是创建了ThreadPoolExecutor对象,不同的是,每个对象的初始 参数值不一样;
六、c#中线程怎么间通信?
回答如下:C# 中线程之间可以通过以下方式进行通信:
1.共享变量:多个线程可以访问同一个共享变量,通过对共享变量的读写操作进行通信。
2.信号量:通过信号量来实现线程之间的同步和互斥。
3.事件:线程可以通过事件来通知其他线程某种状态的变化,其他线程可以通过等待事件的方式来实现通信。
4.管道:线程间可以通过管道进行通信,一个线程将消息写入管道,另一个线程从管道中读取消息。
5.消息队列:线程间可以通过消息队列进行通信,一个线程将消息发送到消息队列中,另一个线程从消息队列中取出消息。
6.共享内存:线程间可以通过共享内存来进行通信,各个线程可以访问同一块内存区域,通过对共享内存的读写操作进行通信。
七、Android线程间通信有哪几种方式?
四种方式,如下:
1、handle机制
2、runOnUiThread方法
3、View.post(Runnable r)
4、AsyncTask
八、java多线程知识讲解?
对于Java编程的多线程知识,我们还是要了解很多的,首先我们要知道。java中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。
Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。
九、java 线程如何执行
当谈到Java编程语言时,线程是一个至关重要的概念。了解线程如何执行对于编写高效的并发程序至关重要。本文将深入探讨Java中线程的执行过程,以帮助开发人员更好地理解并发编程中的关键概念。
Java中线程的基本概念
在Java中,线程是程序中的执行流程。每个Java程序都至少有一个主线程,而且可以创建额外的线程来执行并发任务。线程的执行顺序取决于调度器的决定,这意味着多个线程可以同时执行不同的任务。
线程如何执行:线程的执行顺序是由操作系统的调度器控制的。当一个线程启动时,它会进入就绪状态,等待调度器将其分配到处理器上执行。一旦线程被分配到处理器,它就会开始执行其指定的任务。
线程的生命周期
Java中的线程具有不同的生命周期阶段:
- 新建状态:线程刚被创建时处于新建状态。在这个阶段,线程对象已经被创建,但尚未启动。
- 就绪状态:当线程被启动,但尚未分配处理器时,它处于就绪状态。
- 运行状态:当线程被调度器分配处理器并开始执行时,它处于运行状态。
- 阻塞状态:线程在某些情况下会进入阻塞状态,比如等待I/O操作完成或获取锁。
- 终止状态:当线程执行完其任务或发生异常时,它将进入终止状态。
线程调度
Java中的线程调度是由操作系统的调度器负责的。调度器根据线程的优先级和状态来确定下一个要执行的线程。高优先级的线程将比低优先级的线程更有可能被调度执行。
Java中的线程调度可以使用Thread类中的setPriority()方法为线程设置优先级。线程的优先级范围从1到10,其中1是最低优先级,10是最高优先级。调度器将根据线程的优先级来确定调度顺序。
线程同步在多线程编程中,线程同步是一个重要的概念。当多个线程同时访问共享资源时,可能会导致数据不一致或竞态条件问题。为了避免这些问题,可以使用同步机制来保护共享资源。
线程如何执行:线程的执行顺序是由操作系统的调度器控制的。当一个线程启动时,它会进入就绪状态,等待调度器将其分配到处理器上执行。一旦线程被分配到处理器,它就会开始执行其指定的任务。
线程的生命周期
Java中的线程具有不同的生命周期阶段:
- 新建状态:线程刚被创建时处于新建状态。在这个阶段,线程对象已经被创建,但尚未启动。
- 就绪状态:当线程被启动,但尚未分配处理器时,它处于就绪状态。
- 运行状态:当线程被调度器分配处理器并开始执行时,它处于运行状态。
- 阻塞状态:线程在某些情况下会进入阻塞状态,比如等待I/O操作完成或获取锁。
- 终止状态:当线程执行完其任务或发生异常时,它将进入终止状态。
线程调度
Java中的线程调度是由操作系统的调度器负责的。调度器根据线程的优先级和状态来确定下一个要执行的线程。高优先级的线程将比低优先级的线程更有可能被调度执行。
Java中的线程调度可以使用Thread类中的setPriority()方法为线程设置优先级。线程的优先级范围从1到10,其中1是最低优先级,10是最高优先级。调度器将根据线程的优先级来确定调度顺序。
线程同步
在多线程编程中,线程同步是一个重要的概念。当多个线程同时访问共享资源时,可能会导致数据不一致或竞态条件问题。为了避免这些问题,可以使用同步机制来保护共享资源。
十、怎么让java多线程所有线程休眠?
要让Java多线程中的所有线程休眠,可以使用`Thread.sleep()`方法来让当前线程进入休眠状态。以下是实现的步骤:
1. 在每个线程的执行逻辑中,添加休眠代码:`Thread.sleep()`。这将使当前线程休眠指定的时间。例如,使用以下代码在每个线程中进行休眠:
```java
try {
Thread.sleep(1000); // 休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
```
2. 在每个线程执行逻辑的前或后,都加入休眠代码。这样每个线程都会在执行逻辑之前或之后进入休眠状态。
3. 在主线程中,使用`Thread.join()`方法来等待所有子线程执行完毕。这将确保所有线程都执行完其休眠逻辑后,主线程才会继续往后执行。例如:
```java
Thread t1 = new Thread(new Runnable() {
public void run() {
// 线程1的执行逻辑
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
// 线程2的执行逻辑
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 所有线程执行完毕后,这里是主线程的逻辑
```
在上述代码中,t1和t2是两个子线程,它们分别执行自己的逻辑并休眠不同的时间。在主线程中,使用`t1.join()`和`t2.join()`等待两个子线程执行完毕。只有当两个子线程都执行完毕后,主线程才会继续执行后续逻辑。
通过以上的方式,你可以让Java多线程中的所有线程都进入休眠状态,并控制它们的顺序和执行时间。
热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...