1.自定义类MyThread继承Thread类,为什么要重写run()方法?
自定义类中不是所有的代码都需要被线程执行。 而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()方法,用来包含那些需要被线程执行的代码。 注意:这里的 被线程执行 = 开一个新线程执行
2.run()和start()的区别? run():仅仅是封装被线程执行的代码,直接调用就是普通方法。 start():首先启动了线程,然后再由jvm去调用该线程的run()方法。
3.线程能不能多次启动start()?
不能,一个线程不能被多次启动。线程被多次启动会抛出异常:IllegalThreadStateException:非法的线程状态异常
示例代码如下:
1 package cn.itcast_02;
2
3 /*
4 * 该自定义的类为什么要重写run()方法?
5 * 自定义类中不是所有的代码都需要被线程执行。
6 * 而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()方法,用来包含那些需要被线程执行的代码。
7 *
8 * 注意:这里的 被线程执行 = 开一个新线程执行
9 */
10 public class MyThread extends Thread {
11 // 不需要被线程执行的代码
12 public void show() {
13 System.out.println("不需要被线程执行的代码"); // 这么简单的程序去开一个新的线程,纯属浪费啊!
14 }
15
16 // 需要被线程执行的代码
17 @Override
18 public void run() {
19 // System.out.println("好好学习,天天向上"); // 这么简单的程序去开一个新的线程,纯属浪费啊!
20
21 // 一般来说,被线程执行的代码肯定是比较耗时的。
22 // 所以这里示例:我们使用循环
23 for (int x = 0; x < 1000; x++) {
24 System.out.println(x);
25 }
26 }
27
28 }
1 package cn.itcast_02;
2
3 /*
4 * 需求:我们要实现多线程的程序。
5 *
6 * 如何通过java程序来实现多线程的程序呢?
7 * 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
8 * 而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。
9 *
10 * 而Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。
11 * 但是呢?Java可以去调用C/C++写好的程序来间接实现多线程程序。
12 *
13 * 由C/C++程序去调用系统功能去创建进程,然后由Java进行封装后,这样会产生一些类,我们通过这些类创建的对象去调用他们即可!
14 *
15 * 这样我们就可以通过java程序来实现多线程程序了。
16 *
17 * 那么Java提供的类是什么呢?
18 * Thread类
19 * 通过查看API,我们知道了有2种方式可以实现多线程程序。
20 * (其实有三种方法,第三种明天讲)
21 *
22 * 方式1:继承Thread类。
23 * 是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。之后就可以分配并启动该子类的实例了。
24 * 步骤
25 * A:自定义类MyThread继承Thread类
26 * B:MyThread类里面重写run()方法
27 * C:在测测试类中创建自定义类的对象(创建对象)
28 * D:启动线程
29 */
30 public class MyThreadDemo {
31 public static void main(String[] args) {
32 // 创建线程对象
33 // MyThread my = new MyThread();
34 // 启动线程
35 // my.run();
36 // my.run();
37
38 // 调用run()方法为什么是单线程的呢?
39 // 因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果。
40
41 // 要想看到多线程的效果,就必须说说另一个方法:start()
42 // 面试题:run()和start()的区别?
43 // run():仅仅是封装被线程执行的代码,直接调用就是普通方法。
44 // start():首先启动了线程,然后再由jvm去调用该线程的run()方法。
45
46 // MyThread my = new MyThread();
47 // my.start();
48 // my.start();
49 // IllegalThreadStateException:非法的线程状态异常
50 // 为什么呢?因为这个相当于是my线程被调用了两次。而不是两个线程被启动。一个线程不能被多次启动。
51
52 // 创建两个线程对象
53 MyThread my1 = new MyThread();
54 MyThread my2 = new MyThread();
55
56 my1.start();
57 my2.start();
58 }
59 }