Java多线程学习
-
继承Thread类
-
重写run方法
从官方api里截取的代码
https://docs.oracle.com/javase/9/docs/api/java/lang/Thread.html
class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
主方法调用
PrimeThread p = new PrimeThread(143); p.start();
第二种方法
class PrimeRun implements Runnable { long minPrime; PrimeRun(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } }
主方法调用
PrimeRun p = new PrimeRun(143); new Thread(p).start();
可以看到 官方推荐使用 start();
可为什么 要使用 start方法?
public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { } } } private native void start0();
这里 可以看到源码 里 会抛出一个异常
IllegalThreadStateException()
这个异常是 通过 throw 写在方法上的 自己感觉 8成是RuntimeException
点开 看看源码
IllegalThreadStateException extends IllegalArgumentException
class IllegalArgumentException extends RuntimeException
本人天才...
说起异常
异常 有一个大类 Exception 所有的异常基本都继承这个大类里 这个大类 可以简要分成 两种
一种是程序员可处理的异常 就是RuntimeException 运行时异常 举例来说就是 数组越界等
还有一个是程序员 处理不了的异常 IOException 这种异常啊 基本就是 打开一个不存在的文件
要捕获异常的话
使用 printStackTrace方法非常的方便
言归正传在start方法中 IllegalThreadStateException() 这个异常 是个什么呢?
public void start() Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread. The result is that two threads are running concurrently: the current thread (which returns from the call to the start method) and the other thread (which executes its run method). It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution. Throws: IllegalThreadStateException - if the thread was already started. See Also: run(), stop()
看官方文档吧
IllegalThreadStateException - if the thread was already started.
如果线程已经开启 哪么 抛出这个异常。
试试吧? 重复进行了 线程的启动 m.start();
class Mythread extends Thread { private String title; public Mythread (String title) { this.title = title; } @Override public void run() { for (int i = 0 ; i < 10; i++) { System.out.println(this.title+"线程:"+i); } } } public class duoxianc { public static void main(String args[]) { Mythread m = new Mythread("A"); m.start(); m.start(); new Mythread("b").start(); new Mythread("c").start(); new Mythread("d").start(); } }
结果打印如下 别问我为什么 不是分这来的 电脑太快了
Exception in thread "main" java.lang.IllegalThreadStateException at java.lang.Thread.start(Thread.java:708) at duoxianc.main(duoxianc.java:18) A线程:0 A线程:1 A线程:2 A线程:3 A线程:4 A线程:5 A线程:6 A线程:7 A线程:8 A线程:9
Thread类 提供了 一个start0方法;
private native void start0();
什么是native呢?我也不知道 但是我会百度
native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。
说点人话吧 我感觉就是 在不同的操作系统上 实现 start() 方法
-
Therad类 就说这么多吧
总结一下 两点至关重要的 重写run方法 与 调用start方法