在Java中对于多线程实现一定要有一个线程的主类,而这个线程的主类往往是需要操作一些资源。但是对于这个多线程主类的实现是有一定要求:
- 继承Thread 父类
- 实现Runnable 接口 (Callable接口)
1.继承Thread 类实现多线程
在java.lang包中存在有Thread类,子类继承Thread类之后需要覆写Thread类中的run方法,那么这个方法就属于线程的主方法,定义:public void run()
范例:
package cn.mldn.demo;
class MyThread extends Thread{ //表示实现多线程
private String name;
public MyThread(String name){
this.name = name;
}
@Override
public void run() { //覆写run方法,线程的主方法
for (int i = 0; i < 10; i++) {
System.out.println(this.name+",i="+i);
}
}
}
public class TestDemo {
public static void main(String[] args) {
}
}
在线程的主类之中只是将内容输出10次。但是需要注意的是:所有的多线程的执行一定是并发完成的,即:在同一个时间段上会有多个线程交替执行,所有为了达到这样的目的,绝对不会够直接去调用run()方法,而是应该调用Thread 类中的start()方法去启动多线程:public void start().
范例:
package cn.mldn.demo;
class MyThread extends Thread{ //表示实现多线程
private String name;
public MyThread(String name){
this.name = name;
}
@Override
public void run() { //覆写run方法,线程的主方法
for (int i = 0; i < 10; i++) {
System.out.println(this.name+",i="+i);
}
}
}
public class TestDemo {
public static void main(String[] args) {
MyThread mt1 = new MyThread("线程A");
MyThread mt2 = new MyThread("线程B");
MyThread mt3 = new MyThread("线程C");
mt1.start();
mt2.start();
mt3.start();
}
}
执行效果:
总结:所有的线程都属于交替执行,本身是没有固定的执行顺序的
public class TestDemo {
public static void main(String[] args) {
MyThread mt1 = new MyThread("线程A");
MyThread mt2 = new MyThread("线程B");
MyThread mt3 = new MyThread("线程C");
mt1.run();
mt2.run();
mt3.run();
}
}
效果图:
以上就是start()方法和run()方法的不同之处
原因---》
思考:为什么现在启动多线程不使用run()方法,而非要使用start()方法?
为了方便解释此问题,必须打开Thread类中的start()源代码来观察(E:Java\jdk.8.0_6U\src.zip\java)。(比如咱们平常见到的src.zip压缩包是zip结尾的,不是rar,因为它是收费的)
再往下走\lang\Thread.java下寻找stat()方法:
从start()源码中就会发现,方法会抛出一个异常:,但是整个方法里面没有使用throws声明,没有使用try。。。。catch捕获处理,而之所以会出现这样的情况是因为此异常属于RuntimeException的异常的子类。
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException
java.lang.IllegalArgumentException
java.lang.IllegalThreadStateException
此异常指的是一个线程已经调用了start()方法后又重复执行了start()方法所造成的问题。
在调用start()方法里面发现会调用start0()方法,而start()方法上使用了一个native关键字定义,这会关键字会调用那个本机的操作系统函数。