### Java程序设计线程代码详解 #### 一、单线程与多线程对比 **1.1 单线程程序示例** 该段代码展示了Java中的一个简单的单线程程序,通过`SequentialDemo`类来实现。在这个例子中,有两个`Sequential`对象被创建并调用了它们的`run()`方法。 ```java public class SequentialDemo { public static void main(String args[]) { new Sequential("A").run(); new Sequential("B").run(); } } class Sequential { String name = null; public Sequential(String n) { // 构造器 name = n; } public void run() { for (int i = 0; i < 3; i++) { try { Thread.sleep(500); // 休眠0.5秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("访问:" + name); } } } ``` **运行结果**: ``` 访问:A 访问:A 访问:A 访问:B 访问:B 访问:B ``` 在这个例子中,`Sequential`类的两个实例分别被创建,并立即调用了它们的`run()`方法。因为是在同一个线程中执行(即主线程),所以输出是按照创建顺序依次输出的,没有并发效果。 **1.2 改进版:多线程程序示例** 此部分改进了之前的单线程示例,通过让`PrintName`类继承`Thread`类来实现多线程。在`main()`方法中,创建了两个`PrintName`对象,并调用了它们的`start()`方法。 ```java public class ThreadDemo { public static void main(String args[]) { new PrintName("A").start(); new PrintName("B").start(); } } class PrintName extends Thread { String name = null; public PrintName(String n) { // 构造器 name = n; } public void run() { for (int i = 0; i < 3; i++) { try { Thread.sleep(500); // 休眠0.5秒 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("访问:" + name); } } } ``` **运行结果**(示例): ``` 访问:A 访问:B 访问:A 访问:B 访问:A 访问:B ``` 这里创建了两个线程,因此输出结果会受到操作系统调度的影响而变得不可预测。这体现了多线程的并发性。 #### 二、Runtime与Process的应用 这个示例展示了如何使用Java的`Runtime`类来启动外部程序(如记事本),并通过`waitFor()`方法等待其完成。 ```java public class RunTime_ProcessDemo { public static void main(String[] args) throws Exception { Runtime rt = Runtime.getRuntime(); // 生成Runtime对象 System.out.println("Running notepad.exe"); Process pr = rt.exec("notepad.exe"); // 等待进程终止 int exitValue = pr.waitFor(); System.out.println("Stopping notepad.exe"); System.out.println("终止值:" + exitValue); } } ``` **运行结果**: ``` 启动了“记事本”,关闭后控制台输出信息为: Running notepad.exe Stopping notepad.exe 终止值:0 ``` 在这个示例中,使用了`Runtime.getRuntime().exec(command)`方法来启动外部程序,并通过`pr.waitFor()`等待程序完成,最后输出其退出状态码。 #### 三、创建线程的方式 **3.1 继承Thread类方式创建线程** 这是一种创建线程的传统方法,通过让自定义类继承`Thread`类来实现。 ```java public class PingPong1 extends Thread { private int delay; private String message; public PingPong1(String m, int r) { message = m; delay = r; } public void run() { try { for (int i = 0; i < 10; i++) { System.out.println(message); sleep(delay); // 休眠 } } catch (InterruptedException e) { return; } } public static void main(String[] args) { PingPong1 t1 = new PingPong1("ping", 500); PingPong1 t2 = new PingPong1("pong", 1000); t1.start(); t2.start(); } } ``` **运行结果**(示例): ``` pong ping ping ping pong ping … pong pong ``` 这里创建了两个线程`t1`和`t2`,分别输出`ping`和`pong`,每个线程都有不同的睡眠时间间隔。 **3.2 实现Runnable接口方式创建线程** 这是另一种常见的创建线程的方法,通过实现`Runnable`接口来定义线程的行为。 ```java public class PingPong2 implements Runnable { private int delay; private String message; public PingPong2(String m, int r) { message = m; delay = r; } public void run() { try { for (int i = 0; i < 10; i++) { System.out.println(message); Thread.sleep(delay); // 休眠 } } catch (InterruptedException e) { return; } } public static void main(String[] args) { PingPong2 ping = new PingPong2("ping", 500); PingPong2 pong = new PingPong2("pong", 1000); Thread t1 = new Thread(ping); Thread t2 = new Thread(pong); t1.start(); t2.start(); } } ``` 在这个例子中,`PingPong2`类实现了`Runnable`接口,并重写了`run()`方法。然后在`main()`方法中创建了两个线程对象`t1`和`t2`,并将`PingPong2`对象传递给它们作为目标。 以上几种方法都是创建和管理Java线程的基本手段,它们在实际开发中非常常见。每种方法都有其适用场景,选择哪种取决于具体的需求和个人偏好。
剩余23页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助