如何深入了解并有效运用Java中的Thread类进行多线程编程?

2026-05-22 15:241阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计811个文字,预计阅读时间需要4分钟。

如何深入了解并有效运用Java中的Thread类进行多线程编程?

创建线程的两种方式:继承Thread类和实现Runnable接口。以下是一个简单的示例:

javapublic class WelcomeApp extends Thread { public static void main(String[] args) { WelcomeApp thread=new WelcomeApp(); thread.start(); System.out.printf(1.Welcome, I'm %s.\n, Thread.currentThread().getName()); }}

创建线程的两种方式
  1. extends Thread 类

public class WelComeApp { public static void main(String[] args) { WelcomeThread thread = new WelcomeThread(); thread.start(); System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName()); } public static class WelcomeThread extends Thread { @Override public void run() { System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName()); } } }

  1. 实现 Runnable 接口

public class WelComeApp1 { public static void main(String[] args) { Thread thread = new Thread(() -> System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName())); thread.start(); System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName()); } } 注意事项

  • 一个Thread实例调用过start方法后,就不能再次调用,否则会出现 java.lang.IllegalThreadStateException异常信息
线程的生命周期状态

位于Thread#State枚举列表出6个状态

public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; }

  • NEW

    刚刚创建好的线程对象,在Start方法之前

  • RUNNABLE

    如何深入了解并有效运用Java中的Thread类进行多线程编程?

    在它的内部有两个子状态、ready,running。线程一定是在被cpu调度到了,再一切准备完毕下才能开始工作。

    那么READY就是获取到CPU资源,准备就绪,可以执行。

    RUNNING表示正在程序正在执行,对应到是java代码里的run方法。

  • BLOCKED

    阻塞的, 通常我们说这个形容词都是在文件系统才用的到,这里也可以这么的认为,当前线程被一个I/O操作给阻塞住了,当前所占的cpu资源被分配去做其他事情了!等阻塞完后,再申请CPU资源回到RUNABLE状态。

  • WAITING

    产生这些状态一搬在当前线程调用了Object.wait()Thread.join()

    调用Object.notify()/Object.notifyAll()回到RUNABLE

  • TIMED_WAITING

WAINT状态是有等待某个其他线程结束,而当前状态是带有事件的概念在里面,我可以等,你有时间限制。

  • TERMINATED

    这没啥好说的,当前线程结束。

多线程编程的好处与坏处 优势
  1. 大大的提高了系统的吞吐率
  2. 能充分的利用多核处理器资源
  3. 使用多线程比使用多进程更能节省资源
风险
  1. 线程安全的问题,同一个进程内的线程是共享进程资源,没有做好安全控制可能会导致数据混乱。
  2. 提高了编程难度,比如产生死锁,导致程序奔溃
  3. 可能会加重CPU负担,多个线程工作会导致上下文的切换,这也是一笔不小的开支。

参考

  • 《Java多线程编程实战指南》第1章

本文共计811个文字,预计阅读时间需要4分钟。

如何深入了解并有效运用Java中的Thread类进行多线程编程?

创建线程的两种方式:继承Thread类和实现Runnable接口。以下是一个简单的示例:

javapublic class WelcomeApp extends Thread { public static void main(String[] args) { WelcomeApp thread=new WelcomeApp(); thread.start(); System.out.printf(1.Welcome, I'm %s.\n, Thread.currentThread().getName()); }}

创建线程的两种方式
  1. extends Thread 类

public class WelComeApp { public static void main(String[] args) { WelcomeThread thread = new WelcomeThread(); thread.start(); System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName()); } public static class WelcomeThread extends Thread { @Override public void run() { System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName()); } } }

  1. 实现 Runnable 接口

public class WelComeApp1 { public static void main(String[] args) { Thread thread = new Thread(() -> System.out.printf("2.Welcome, I'm %s.%n", Thread.currentThread().getName())); thread.start(); System.out.printf("1.Welcome, I'm %s.%n", Thread.currentThread().getName()); } } 注意事项

  • 一个Thread实例调用过start方法后,就不能再次调用,否则会出现 java.lang.IllegalThreadStateException异常信息
线程的生命周期状态

位于Thread#State枚举列表出6个状态

public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; }

  • NEW

    刚刚创建好的线程对象,在Start方法之前

  • RUNNABLE

    如何深入了解并有效运用Java中的Thread类进行多线程编程?

    在它的内部有两个子状态、ready,running。线程一定是在被cpu调度到了,再一切准备完毕下才能开始工作。

    那么READY就是获取到CPU资源,准备就绪,可以执行。

    RUNNING表示正在程序正在执行,对应到是java代码里的run方法。

  • BLOCKED

    阻塞的, 通常我们说这个形容词都是在文件系统才用的到,这里也可以这么的认为,当前线程被一个I/O操作给阻塞住了,当前所占的cpu资源被分配去做其他事情了!等阻塞完后,再申请CPU资源回到RUNABLE状态。

  • WAITING

    产生这些状态一搬在当前线程调用了Object.wait()Thread.join()

    调用Object.notify()/Object.notifyAll()回到RUNABLE

  • TIMED_WAITING

WAINT状态是有等待某个其他线程结束,而当前状态是带有事件的概念在里面,我可以等,你有时间限制。

  • TERMINATED

    这没啥好说的,当前线程结束。

多线程编程的好处与坏处 优势
  1. 大大的提高了系统的吞吐率
  2. 能充分的利用多核处理器资源
  3. 使用多线程比使用多进程更能节省资源
风险
  1. 线程安全的问题,同一个进程内的线程是共享进程资源,没有做好安全控制可能会导致数据混乱。
  2. 提高了编程难度,比如产生死锁,导致程序奔溃
  3. 可能会加重CPU负担,多个线程工作会导致上下文的切换,这也是一笔不小的开支。

参考

  • 《Java多线程编程实战指南》第1章