Java中的多线程函数实现与调用
Java是一门面向对象的编程语言,支持多线程编程。多线程是指同一个程序中有多个控制流同时执行,多个线程并发的执行代码,线程之间相互独立,可以并行执行,提升程序的效率。Java中多线程编程的基础是Thread类,通过创建Thread类的子类对象实现多线程编程。
Java中实现多线程的方法
1. 继承Thread类
继承Thread类需要重写run方法,在run方法中编写线程的代码。使用start方法启动线程。示例代码如下:
public class MyThread extends Thread {
public void run(){
//线程要执行的代码
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();//创建一个线程对象
thread.start();//启动线程
}
}
2. 实现Runnable接口
实现Runnable接口同样需要重写run方法,在run方法中编写线程的代码。使用Thread类的构造函数创建一个线程对象,将Runnable对象作为参数传入,使用start方法启动线程。示例代码如下:
public class MyTask implements Runnable {
public void run() {
// 线程要执行的代码
}
}
public class Main {
public static void main(String[] args) {
MyTask task = new MyTask();//创建一个任务对象
Thread thread = new Thread(task);//创建一个线程对象,将任务对象转换成线程对象
thread.start();//启动线程
}
}
3. 使用Callable实现多线程
Callable是Java中的一个接口,它用来实现带返回值的线程。与Runnable的run方法不同,callable的call方法可以返回线程的运算结果。同时,在执
行带有返回值的任务时需要使用Future来保存执行结果。示例代码如下:
public class MyCallable implements Callable<Integer>{
public Integer call() throws Exception{
// 计算和返回结果
return 100;
}
}
public class Main {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> result = executor.submit(new MyCallable());
Integer sum = result.get();// 获取线程的返回值
System.out.println(sum);
executor.shutdown();
}
}
Java中多线程的调度
在使用多线程的时候,我们需要注意所有线程都是并发执行的,它们之间的执行顺序是不确定的,取决于OS对线程的调度。Java提供了不同的方法来调度线程的执行,这些方法常用的有:
1. sleep方法
sleep方法使线程进入睡眠状态,暂停指定的时间,交出CPU给其他线程,经过的时间可以由另一个线程、或者OS调度器计算。示例代码如下:
public class MyThread extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(i);
try {
Thread.sleep(1000);// 线程休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread thread = new MyThread();
thread.start();
}
}
2. yield方法
yield方法使线程从运行状态转为就绪状态,它让出CPU时间让其他线程执行,但是不保证当前线程的让出的CPU时间(也就是当前线程Pause的时间)一定能够让其他线程一定执行。
public class YieldExample {
public static void main(String[] args) {
YieldTask task1 = new YieldTask("Task1");
YieldTask task2 = new YieldTask("Task2");
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
thread1.start();
thread2.start();
}
}
public class YieldTask implements Runnable {
private String name;
YieldTask(String name) {
this.name = name;
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + ": " + i);
// 当i = 2时,让出CPU,转到线程调度实体决定下一个线程谁来执行
if(i == 2){
Thread.yield();
}
}
}
}
3. join方法
join方法是用于等待一个线程执行结束的方法,让“主线程”或进程等待子线程结束后再继续执行。
4. wait、notify和notifyAll方法
wait、notify和notifyAll是Java中线程间的通信机制,这些方法只能在同步方法或同步块中使用。wait方法让线程处于等待状态,直到其他线程调用notify或notifyAll方法唤醒它;notify方法唤醒在等待中的线程,notifyAll方法唤醒所有在等待中的线程。
总结
Java多线程编程是很实用的技能,在实际应用中经常需要使用到多线程技术。在Java中实现多线程有多种方法可选择,常用的有继承Thread类、实现Runnable接口和使用Callable实现。同时,Java中也提供了多种方法来调度线程执行,如sleep、yield和join等。开发者在使用多线程的时候,需要深入理解线程的调度机制,根据具体的业务需求选择合适的调度方式,合理地使用多线程技术,可以提升程序的性能、降低系统负载。
