多线程(三)--实现多线程的两种方式

  1. Thread和Runnable简介

    • Runable是一个接口,里面只有一个方法,启动多线程只需要实现这个接口,通过new Thread(new A())等方式新建线程

      public interface Runnable {
      
              public abstract void run();
      
                  }
      
    • Thread是一个类,其实这个类本身实现了runable接口的

      public class Thread implements Runnable {
      
          }
      
  2. Thread和Runnable的异同点

    • 相同:都是多线程的实现方式
    • 不同:
      • Thread类,Runable是接口,接口可以多实现,类只能单继承,
      • Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源
  3. 继承Thead多线程的例子

        class MyThread1 extends Thread{
        private int ticket = 10;
    
    
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                if (this.ticket > 0) {
    
                    //模拟网络延迟
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(this.getName() + "卖票 : ticket " + this.ticket--);
                }
            }
        }
    }
    
    
    public class ThreadTest {
    
        public static void main(String[] args) {
            MyThread1 t1= new MyThread1();
            MyThread1 t2= new MyThread1();
            MyThread1 t3= new MyThread1();
    
    
            t1.start();
            t2.start();
            t3.start();
    
    
        }
    
    
    }
    

    运行结果:

    Thread-1卖票 : ticket 10
    Thread-0卖票 : ticket 10
    Thread-2卖票 : ticket 10
    Thread-2卖票 : ticket 9
    Thread-1卖票 : ticket 9
    Thread-0卖票 : ticket 9
    Thread-0卖票 : ticket 8
    Thread-1卖票 : ticket 8
    Thread-2卖票 : ticket 8
    Thread-0卖票 : ticket 7
    Thread-1卖票 : ticket 7
    Thread-2卖票 : ticket 7
    Thread-0卖票 : ticket 6
    Thread-1卖票 : ticket 6
    Thread-2卖票 : ticket 6
    Thread-2卖票 : ticket 5
    Thread-1卖票 : ticket 5
    Thread-0卖票 : ticket 5
    Thread-0卖票 : ticket 4
    Thread-1卖票 : ticket 4
    Thread-2卖票 : ticket 4
    Thread-2卖票 : ticket 3
    Thread-1卖票 : ticket 3
    Thread-0卖票 : ticket 3
    Thread-0卖票 : ticket 2
    Thread-1卖票 : ticket 2
    Thread-2卖票 : ticket 2
    Thread-0卖票 : ticket 1
    Thread-2卖票 : ticket 1
    Thread-1卖票 : ticket 1
    

    总结:

    1. MyThread继承于Thread,它是自定义个线程。每个MyThread都会卖出10张票
    2. 主线程main创建并启动3个MyThread子线程。每个子线程都各自卖出了10张票。
    3. 根据机器的不同,每次运行的结果是不一样的,有可能有些人看不到这么明显的效果,这也很正常。所谓的多线程,指的是两个线程的代码可以同时运行,而不必一个线程需要等待另一个线程内的代码执行完才可以运行。对于单核CPU来说,是无法做到真正的多线程的,每个时间点上,CPU都会执行特定的代码,由于CPU执行代码时间很快,所以两个线程的代码交替执行看起来像是同时执行的一样。那具体执行某段代码多少时间,就和分时机制系统有关了。分时系统把CPU时间划分为多个时间片,操作系统以时间片为单位片为单位各个线程的代码,越好的CPU分出的时间片越小。所以看不到明显效果也很正常,一个线程打印5句话本来就很快,可能在分出的时间片内就执行完成了
  4. 实现Runable多线程的例子

        class MyThread implements Runnable {
        private int ticket = 10;
    
    
        @Override
        public void run() {
            for (int i = 0; i < 20; i++) {
                if (this.ticket > 0) {
    
                    //try {
                    //    Thread.sleep(100);
                    //} catch (InterruptedException e) {
                    //    e.printStackTrace();
                    //}
                    System.out.println(Thread.currentThread().getName() + "卖票 : ticket " + this.ticket--);
    
    
                }
            }
        }
    }
    
    public class RunnableTest {
        public static void main(String[] args) {
            MyThread mt = new MyThread();
    
            // 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票!
            Thread t1 = new Thread(mt);
            Thread t2 = new Thread(mt);
            Thread t3 = new Thread(mt);
            t1.start();
            t2.start();
            t3.start();
    
        }
    
    
    }
    

    运行结果:

    Thread-0卖票 : ticket 10
    Thread-2卖票 : ticket 8
    Thread-1卖票 : ticket 9
    Thread-2卖票 : ticket 6
    Thread-0卖票 : ticket 7
    Thread-2卖票 : ticket 4
    Thread-1卖票 : ticket 5
    Thread-2卖票 : ticket 2
    Thread-0卖票 : ticket 3
    Thread-1卖票 : ticket 1
    

    总结:

    1. 主线程main创建并启动3个子线程,而且这3个子线程都是基于“t1这个Runnable对象”而创建的。运行结果是这3个子线程一共卖出了10张票。这说明它们是共享了MyThread接口的。
    2. 这个接口可以用于有共享资源的情况下

猜你喜欢

转载自blog.csdn.net/qq_25385555/article/details/79004179