所谓并发,就是指一个系统中同时存在多个活动实体,比如线程。它们共享系统的资源,但是彼此之间又要独立运行。就像一群可爱的小蚂蚁,大家在同一个土堆里忙碌,但每只蚂蚁都有自己的任务。
在Java里,我们可以使用Thread
类或者实现Runnable
接口来创建线程。当然,Java也提供了更高级的并发工具,比如Executor
框架和Future
接口,让并发编程变得更加方便。
public class ConcurrentAnts {
public static void main(String[] args) {
System.out.println("欢迎来到并发的蚂蚁世界!(^?^)っ");
// 创建一群蚂蚁线程
Thread ant1 = new Thread(new Ant("小蚂蚁1"));
Thread ant2 = new Thread(new Ant("小蚂蚁2"));
Thread ant3 = new Thread(new Ant("小蚂蚁3"));
// 启动蚂蚁们
ant1.start();
ant2.start();
ant3.start();
}
}
class Ant implements Runnable {
private String name;
public Ant(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(name + "正在搬运食物,第" + i + "次!(^?^)");
try {
Thread.sleep(1000); // 模拟搬运食物的过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(name + "的任务完成啦!?(???。)?");
}
}
run()
和 start()
方法是多线程编程中非常关键的两个方法,让我们一起了解一下:
run()
方法:定义线程的执行体: run()
方法是用来定义线程实际执行的任务逻辑的地方。
普通方法调用: 如果直接调用 run()
方法,那么它就会像普通的方法一样在当前线程中执行,并不会创建新的线程。
不会启动新线程: 当我们通过 thread.run()
调用时,任务会在当前线程中执行,不会启动新的线程,不具备并发的效果。
start()
方法:启动线程: start()
方法是用来启动一个新线程,并调用线程的 run()
方法。
创建新线程: 当我们调用 thread.start()
时,会创建一个新的线程,并在新线程中执行 run()
方法。
并发执行: 启动新线程后,新线程和当前线程可以并发执行,达到多线程的效果。
下面是一个简单的例子,演示了 run()
和 start()
的区别:
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getId() + " Value " + i);
}
}
}
public class ThreadExample {
public static void main(String[] args) {
MyThread myThread = new MyThread();
// 使用 run() 方法,不会启动新线程
myThread.run();
// 使用 start() 方法,启动新线程
myThread.start();
}
}
run()
方法是Thread类中用于定义线程执行体的方法,是一个约定俗成的命名规则,不能写成其他的名字,否则编译器会认为你没有实现Runnable
接口的run
方法,从而导致编译错误。
(^?^)っ 在Java中,线程的休眠可以通过 Thread.sleep()
方法来实现。这个方法允许你让当前正在执行的线程休眠指定的时间(以毫秒为单位)。
下面是一个简单的例子,展示了如何在Java中使用 Thread.sleep()
来使线程休眠
public class SleepExample {
public static void main(String[] args) {
System.out.println("开始执行...");
try {
// 休眠 3 秒
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("休眠结束,继续执行!");
}
}
并发访问同一个资源可能会出现问题,建议加入同步synchronized。