一、新建线程的三种方式
Java多线程启动方式有三种:继承Thread类、实现Runnable接口和实现Callable接口。
1.继承Thread类
继承Thread类并重写run()方法,将需要并发处理的逻辑写在其中,如下所示:
public class MyThread extends Thread { @Override public void run() { //需要实现的并发逻辑 } } //在其他类中启动线程 MyThread thread = new MyThread(); thread.start();
2.实现Runnable接口
实现Runnable接口并重写run()方法,将需要并发处理的逻辑写在其中,如下所示:
public class MyRunnable implements Runnable { @Override public void run() { //需要实现的并发逻辑 } } //在其他类中启动线程 MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start();
3.实现Callable接口
实现Callable接口并重写call()方法,将需要并发处理的逻辑写在其中,如下所示:
public class MyCallable implements Callable{ @Override public String call() { //需要实现的并发逻辑 return "result"; } } //在其他类中启动线程 MyCallable callable = new MyCallable(); FutureTask task = new FutureTask<>(callable); Thread thread = new Thread(task); thread.start(); //获取并发处理结果 String result = task.get();
二、线程的状态
每个线程在执行过程中会有不同的状态。Java中的线程状态包括:新建(New)、运行(Runnable)、阻塞(Blocked)、等待(Waiting)、定时等待(Time Waiting)、结束(Terminated)等状态。可以通过Thread类的getState()方法获取线程的状态。
三、线程同步
在多线程并发编程中,存在线程安全问题,需要使用同步机制解决。Java中的同步机制包括:synchronized、Lock等。其中synchronized关键字最为常用,对于一段需要保证原子性的代码,可以使用synchronized关键字将其变成同步代码块。
public class MyRunnable implements Runnable { private int count = 0; @Override public void run() { synchronized (this) { for (int i = 0; i < 5; i++) { count++; } System.out.println("count=" + count); } } } //在其他类中启动线程 MyRunnable runnable = new MyRunnable(); Thread thread1 = new Thread(runnable); Thread thread2 = new Thread(runnable); thread1.start(); thread2.start();
四、线程池
线程池是为了更好地利用系统的资源、提高系统性能而设计的,通过对多线程的重复创建和销毁等操作,利用线程池可以使系统更加稳定、响应更加灵敏。Java中的线程池可以使用ThreadPoolExecutor类实现。
public class MyRunnable implements Runnable { @Override public void run() { //需要实现的并发逻辑 } } //创建线程池 ExecutorService executor = Executors.newFixedThreadPool(5); //提交多个任务 for (int i = 0; i < 10; i++) { MyRunnable runnable = new MyRunnable(); executor.execute(runnable); } //关闭线程池 executor.shutdown();
五、死锁
死锁是多线程编程中的一种常见情况,当两个或多个线程互相持有对方需要的资源,却又不释放对方需要的资源时,就会发生死锁。死锁会导致程序卡死,需要通过代码和工具分析,找出死锁的原因,并进行解决。
六、线程安全的集合类
Java中提供了许多线程安全的集合类,例如ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等。这些集合类在多线程环境下使用更为安全、高效。
ConcurrentHashMapmap = new ConcurrentHashMap<>(); map.put("key", "value"); Object value = map.get("key");
七、总结
Java中多线程的启动方式有三种,包括继承Thread类、实现Runnable接口和实现Callable接口。在多线程并发编程中需要使用同步机制来解决线程安全问题,Java中的线程池可以更好地利用系统资源、提高系统性能。同时需要注意死锁等问题,使用线程安全的集合类可以更为安全、高效地处理多线程并发问题。