线程基础
为什么要多线程
当我们的应用程序需要执行多个任务, 并希望通过使这些任务同时运行来提高性能和响应时, 就需要使用多线程来实现;
使用多线程编程可以更有效地利用计算资源, 同时确保应用程序的流畅运行.
线程创建方式
线程是比较轻量的, 与进程相比, 线程消耗的资源较少, 因为线程可以共享相同进程的内存空间;
在 Java 线程模型中, 可以在同一个程序中使用多个线程执行不同任务的, 线程的存在提高了程序性能和响应能力;
实现 Runnable 接口
通过实现 Runnable 接口, 重写 run()
方法, 接着将实现类的实例作为参数传到 Thread 类中, 实现线程.
java
// 私有静态内部类
private static class RunnableThread implements Runnable {
@Override
public void run() {
System.out.println("当前线程: " + Thread.currentThread().getName());
System.out.println("使用Runnable创建线程 ... ");
}
}
public static void main(String[] args) {
RunnableThread runnableThread = new RunnableThread();
Thread thread = new Thread(runnableThread);
System.out.println("当前为主线程: " + Thread.currentThread().getName());
thread.start();
}
继承 Thread 类
通过继承 Thread 类来实现线程, 覆盖 run()
方法自定义线程操作, 将Thread子类实例化之后, 调用 start()
即可启动另一个线程;
java
private static class ThreadChild extends Thread {
@Override
public void run() {
System.out.println("当前线程: " + Thread.currentThread().getName());
System.out.println("继承Thread实现多线程 ... ");
}
}
public static void main(String[] args) {
ThreadChild child = new ThreadChild();
child.start();
System.out.println("主线程: " + Thread.currentThread().getName());
}
实现 Callable 接口
除了实现 Runnable 接口之外, 还可以实现 Callable 接口来创建线程, 不同的是Callable创建的线程是有返回值的, 通过泛型指定返回值类型, 把线程执行结果作为返回值返回;
java
private static class CallableThread implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("当前线程: " + Thread.currentThread().getName());
System.out.println("使用Callable创建线程 ... ");
Random random = new Random();
return random.nextInt();
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
CallableThread callableThread = new CallableThread();
FutureTask<Integer> futureTask = new FutureTask<>(callableThread);
Thread thread = new Thread(futureTask);
thread.start();
Integer result = futureTask.get();
System.out.println(result);
}
线程主要参数及接口
优先级
线程的优先级用于指定线程的执行顺序, 通常优先级越高的线程会优先执行;