本文概述
Java runnable是用于在并发线程上执行代码的接口。如果我们希望该类的实例应由线程执行, 则该接口可以由任何类实现。
可运行接口具有未定义的方法run(), 其返回类型为void, 并且不接受任何参数。下面给出了run()方法的方法摘要-
方法 | 描述 |
---|---|
public void run() | 此方法不接受任何参数。当使用实现Runnable类的类的对象创建线程时, 将在单独执行的线程中调用run方法。 |
可运行接口为希望在活动状态下执行代码的类的实例提供一组标准规则。 Runnable接口最常见的用例是当我们只想覆盖run方法时。当线程由实现Runnable的任何类的对象启动时, 则它将在单独执行的线程中调用run方法。
实现Runnable的类在实例化Thread实例并将其自身作为目标传递时, 无需在子类Thread上运行而在其他线程上运行。这很重要, 因为除非有意修改或增强类的基本行为, 否则不应将类归为子类。
由于每个线程代表一个单独的控制流, 因此可运行类在网络编程中被广泛使用。同样在多线程编程中, 使用Runnable类。此接口存在于java.lang包中。
实施可运行
这是通过实现Runnable创建线程的最简单方法。通过实现Runnable, 可以在任何对象上创建线程。要实现一个Runnable, 只需实现run方法。
公共无效run()
在此方法中, 我们具有要在并发线程上执行的代码。在这种方法中, 我们可以使用变量, 实例化类并执行与主线程相同的操作。该线程将一直保留到该方法返回为止。 run方法建立新线程的入口点。
如何使用Runnable接口创建线程
要使用runnable创建线程, 请使用以下代码-
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
线程将执行在其参数中传递的Runnable对象的run()方法中提到的代码。
使用runnable的简单线程示例
public class ExampleClass implements Runnable {
@Override
public void run() {
System.out.println("Thread has ended");
}
public static void main(String[] args) {
ExampleClass ex = new ExampleClass();
Thread t1= new Thread(ex);
t1.start();
System.out.println("Hi");
}
}
输出:
在网络编程中使用Runnable类
runnable类用于执行多线程编程, 尤其是在服务器端, 因为服务器可能会收到来自不同客户端的多个请求。为了快速而有效地解决此问题, 我们使用了多线程编程。
使用Runnable-的网络程序示例
以下程序显示了一个服务器程序, 该程序创建一个线程, 然后创建一个套接字, 并等待客户端连接到该线程, 并请求输入字符串-
public class Example {
public static void main(String[] args) {
new Thread(new SimpleServer()).start();
}
static class SimpleServer implements Runnable {
@Override
public void run() {
ServerSocket serverSocket = null;
while (true) {
try {
serverSocket = new ServerSocket(3333);
Socket clientSocket = serverSocket.accept();
BufferedReader inputReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
System.out.println("Client said :"+inputReader.readLine());
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
在此程序中, 我们正在线程上为客户端创建套接字。通常, 在服务器中为不同的客户端请求创建不同的线程。但是, 如果编译器控制每线程内存的能力很差, 则为每个客户端创建一个单独的线程不是一个好习惯。
线程与可运行
根据线程类和Runnable接口的性能, 内存使用情况和组成, 它们之间存在一些差异。
- 通过扩展线程, 将产生其他方法的开销, 即它们消耗过多或间接的内存, 计算时间或其他资源。
- 由于在Java中, 我们只能扩展一个类, 因此, 如果我们扩展Thread类, 则将无法扩展任何其他类。这就是为什么我们应该实现Runnable接口来创建线程的原因。
- Runnable使代码更加灵活, 因为如果我们正在扩展线程, 则我们的代码将仅位于线程中, 而如果是Runnable, 则可以在各种执行程序服务中传递它, 或将其传递给单线程环境。
- 如果我们实现Runnable接口, 则代码的维护很容易。
评论前必须登录!
注册