java 22 - 4 多线程的代码实现的方式1

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 22 - 4 多线程的代码实现的方式1相关的知识,希望对你有一定的参考价值。

需求:我们要实现多线程的程序。
  如何实现呢?
  由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
  而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。
  Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。
  但是,Java可以去调用C/C++写好的程序来实现多线程程序。
   由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西,
  然后提供一些类供我们使用。我们就可以实现多线程程序了。
那么Java提供的类是什么呢?
Thread类
通过查看API,我们知道了有2种方式实现多线程程序。

方式1:继承Thread类。
步骤
  A:自定义类MyThread继承Thread类。
  B:MyThread类里面重写run()
    为什么是run()方法呢?     

  不是类中的所有代码都需要被线程执行的。
  需要被线程执行的代码,是那些执行时间较长的,而别的代码要等着它运行完后才能运行。
  所以这个时候,这种代码就需要被线程执行。
  而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()用来包含那些被线程执行的代码。

  C:创建对象
  D:启动线程

 

自定义MyThread类,并重写run()方法

 1 //注意:创建这个类时,要继承Thread类
 2 
 3 public class MyThread extends Thread {
 4 
 5     public void run() {
 6         
 7         for(int x = 0; x < 1000; x++){
 8             System.out.println(x);
 9         }
10     }
11 
12 }

 

测试:

首先我们试下用run()来运行

1 // 创建线程对象
2 MyThread my = new MyThread();
3  // 启动线程
4 my.run();
5 my.run();

结果是:

  依旧是单线程执行,先是执行一次run(),把0-999打印完,然后再执行一次

为什么呢?  

  因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果
要想看到多线程的效果,就必须说说另一个方法:start()

 

这里有个面试题: 

  run()和start()的区别?
 run():仅仅是封装被线程执行的代码,直接调用是普通方法
 start():首先启动了线程,然后再由jvm去调用该线程的run()方法。

 

再试试start()方法:

1 MyThread my = new MyThread();
2  my.start();
3 my.start();

执行结果: 提示IllegalThreadStateException错误 :非法的线程状态异常

原因:

  因为这个相当于是my线程被调用了两次。而不是两个线程启动。

 

再次更改:

1 // 创建两个线程对象
2 MyThread my1 = new MyThread();
3 MyThread my2 = new MyThread();
4 
5 my1.start();
6 my2.start();

执行结果:同时执行2个打印0-1000的线程,打印出来的结果:线程1和线程2抢资源,抢到的就执行,这次你抢到,下次我抢到,输出结果也如此。

 

以上是关于java 22 - 4 多线程的代码实现的方式1的主要内容,如果未能解决你的问题,请参考以下文章

java 22 - 12 多线程之解决线程安全问题的实现方式1

Java多线程——Thread的native底层实现

Java多线程实现的4中方式

java多线程系列1-初识多线程多线程4种实现方式

java多线程系列1-初识多线程多线程4种实现方式

4-5 《Java中多线程重点》——继承Thread实现Runnable死锁线程池Lambda表达式