ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java多线程(一) [打印本页]

作者: 涛声依旧在    时间: 2022-9-5 01:53
标题: Java多线程(一)
Java多线程(一)


目录

一、基本概念:程序、进程、线程

二、多线程的创建与使用

2.1 多线程的创建方式一:继承于Thread类

  1.    public synchronized void start() {
  2.            /**
  3.             * This method is not invoked for the main method thread or "system"
  4.             * group threads created/set up by the VM. Any new functionality added
  5.             * to this method in the future may have to also be added to the VM.
  6.             *
  7.             * A zero status value corresponds to state "NEW".
  8.             */
  9.            if (threadStatus != 0)
  10.                throw new IllegalThreadStateException();
  11.    
  12.            /* Notify the group that this thread is about to be started
  13.             * so that it can be added to the group's list of threads
  14.             * and the group's unstarted count can be decremented. */
  15.            group.add(this);
  16.    
  17.            boolean started = false;
  18.            try {
  19.                start0();
  20.                started = true;
  21.            } finally {
  22.                try {
  23.                    if (!started) {
  24.                        group.threadStartFailed(this);
  25.                    }
  26.                } catch (Throwable ignore) {
  27.                    /* do nothing. If start0 threw a Throwable then
  28.                      it will be passed up the call stack */
  29.                }
  30.            }
  31.            }
复制代码
  1. //1. 创建一个继承于Thread类的子类
  2. class MyThread extends Thread {
  3.     //2. 重写Thread类的run()
  4.     @Override
  5.     public void run() {
  6.         for (int i = 0; i < 100; i++) {
  7.             if(i % 2 == 0){
  8.                 System.out.println(Thread.currentThread().getName() + ":" + i);
  9.             }
  10.         }
  11.     }
  12. }
  13. public class ThreadTest {
  14.     public static void main(String[] args) {
  15.         //3. 创建Thread类的子类的对象
  16.         MyThread t1 = new MyThread();
  17.         //4.通过此对象调用start():
  18.         t1.start();
  19. //      t1.start(); 报 IllegalThreadStateException 异常
  20.         
  21.         //需要重新创建一个线程的对象
  22.         MyThread t2 = new MyThread();
  23.         t2.start();
  24.         //如下操作仍然是在main线程中执行的。
  25.         for (int i = 0; i < 100; i++) {
  26.             if(i % 2 == 0){
  27.                 System.out.println(Thread.currentThread().getName() + ":" + i );
  28.             }
  29.         }
  30.     }
  31. }
复制代码
  1. public class ThreadDemo {
  2.     public static void main(String[] args) {
  3.         //创建Thread类的匿名子类的方式
  4.         new Thread(){
  5.             @Override
  6.             public void run() {
  7.                 for (int i = 0; i < 100; i++) {
  8.                     if(i % 2 == 0){
  9.                         System.out.println(Thread.currentThread().getName() + ":" + i);
  10.                     }
  11.                 }
  12.             }
  13.         }.start();
  14.     }
  15. }
复制代码
2.2 Thread中的常用方法:

2.3 线程的调度

说明:高优先级的线程要抢占低优先级线程 cpu 的执行权。但是只是从概率上讲,高优先级的线程高概率的情况下被执行。并不意味着只有当高优先级的线程执行完以后,低优先级的线程才执行。
2.4 多线程的创建方式之二:实现Runnable接口

  1. //1. 创建一个实现了Runnable接口的类
  2. class MThread implements Runnable{
  3.     //2. 实现类去实现Runnable中的抽象方法:run()
  4.     @Override
  5.     public void run() {
  6.         for (int i = 0; i < 100; i++) {
  7.             if(i % 2 == 0){
  8.                 System.out.println(Thread.currentThread().getName() + ":" + i);
  9.             }
  10.         }
  11.     }
  12. }
  13. public class ThreadTest1 {
  14.     public static void main(String[] args) {
  15.         //3. 创建实现类的对象
  16.         MThread mThread = new MThread();
  17.         //4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
  18.         Thread t1 = new Thread(mThread);
  19.         t1.setName("线程1");
  20.         //5. 通过Thread类的对象调用start():① 启动线程 ②调用当前线程的run()-->调用了Runnable类型的target的run()
  21.         t1.start();
  22.         //再启动一个线程,遍历100以内的偶数
  23.         Thread t2 = new Thread(mThread);        // 注:不需要重新创建Runnable实现类对象
  24.         t2.setName("线程2");
  25.         t2.start();
  26.     }
  27. }
复制代码
解析 t1.start() 启动线程后调用了 Runnable 接口实现类 MThread 的 run() 方法:
  1. //        1.在创建Thread类的对象时将实现Runnable接口的对象作为参数传递到Thread类的构造器中
  2. Thread t = new Thread(target);
  3. //  2.使用start()方法启动线程,在Thread类中重写的run()源码如下:
  4. @Override
  5.     public void run() {
  6.         if (target != null) {
  7.             target.run();
  8.         }
  9.     }
  10. //  3.当target不为null时,则调用target,也就是调用我们定义的Runnable接口实现类的 run() 方法
复制代码
2.5 比较创建线程的两种方式。

  1. //        例子:三个窗口卖票,总票数为100张
  2. //  使用继承 Thread 类的方式(存在线程的安全问题,待解决)
  3. class Window extends Thread{
  4.     private static int ticket = 100;        // ticket变量须声明为static,才能实现三个窗口共享100张票
  5.     @Override
  6.     public void run() {
  7.         while(true){
  8.             if(ticket > 0){
  9.                 System.out.println(getName() + ":卖票,票号为:" + ticket);
  10.                 ticket--;
  11.             }else{
  12.                 break;
  13.             }
  14.         }
  15.     }
  16. }
  17. public class WindowTest {
  18.     public static void main(String[] args) {
  19.         Window t1 = new Window();
  20.         Window t2 = new Window();
  21.         Window t3 = new Window();
  22.         t1.setName("窗口1");
  23.         t2.setName("窗口2");
  24.         t3.setName("窗口3");
  25.         t1.start();
  26.         t2.start();
  27.         t3.start();
  28.     }
  29. }
  30. ---------------------------------------------------------------------------------------------------------
  31. //        使用实现 Runnable 接口的方式(存在线程的安全问题,待解决)
  32. class Window1 implements Runnable{
  33.     private int ticket = 100;        // ticket不需要声明为static,原因:测试类中只创建了一个window1实例对象w,三个线程均调用同一个实例对象
  34.    
  35.     @Override
  36.     public void run() {
  37.         while(true){
  38.             if(ticket > 0){
  39.                 System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + ticket);
  40.                 ticket--;
  41.             }else{
  42.                 break;
  43.             }
  44.         }
  45.     }
  46. }
  47. public class WindowTest1 {
  48.     public static void main(String[] args) {
  49.         Window1 w = new Window1();
  50.         Thread t1 = new Thread(w);
  51.         Thread t2 = new Thread(w);
  52.         Thread t3 = new Thread(w);
  53.         t1.setName("窗口1");
  54.         t2.setName("窗口2");
  55.         t3.setName("窗口3");
  56.         t1.start();
  57.         t2.start();
  58.         t3.start();
  59.     }
  60. }
复制代码
三、线程的生命周期

要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用 Thread 类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4