创建线程的三种方式:
1,继承Thread类 为java.lang包下
2,实现Runnable接口
3,实现Callable接口(为juc并发包下的)
Thread类:
内部也是继承Runnable接口,需要重写run()方法。
创建线程方式:1.重写run()方法。2.建立子类对象,对象调用.start() 方法
package com.wxh.thread;
/**
* 编写对象继承Thread建立线程
* 1.重写run()方法;因为API中的Thread类也会实现了Runnable接口,所以需要重写run()方法
* 2.建立类的对象,调用start开启一个新线程(原main方法也是一个线程)
* 直接对象.run()方法不是开启线程,而是普通的调用方法。
* 注意:线程的调用时机需要判断,因为在main方法中写一个线程执行完之后,才开启线程,就显得开启一个新线程意义不大!!
* @author Administrator
*
*/
public class ThreadTest extends Thread{
public void run() {
for(int i = 0;i<20;i++) {
System.out.println("一遍听音乐");
}
}
public static void main(String[] args) {
ThreadTest ts = new ThreadTest();
ts.start(); //开启一条新线程,与main()方法中的主线程一起执行(抢占cpu优先调配)
for(int i = 0; i< 20;i++) {
System.out.println("一边coding");
}
//ts.start(); //此时在开启一个新线程的话,main主线程中已经执行输出coding循环完毕,开启新线程意义不大
}
}
方式2:实现Runnable,重写其run()方法,实现线程
package com.wxh.thread;
/**
* 实现线程方式2:1.实现Runnable类,重写run()方法
* 2.建立实现类,
* 2.创建代理类,并传入实现类,
* 3.代理类启动start();
* @author Administrator
* 推荐:避免单继承的局限性,优先使用接口 ,方便共享资源
*/
public class StatRun implements Runnable {
public void run() {
for(int i = 0; i< 20;i++) {
System.out.println("一边听音乐");
}
}
public static void main(String[] args) {
//创建实现类对象
StatRun r1 = new StatRun();
//创建代理类对象
Thread t1 = new Thread(r1);
t1.start(); //开启新线程 不保证立即运行,cpu调用
// new Thread(new StatRun()).start(); //当对象只调用一次时,可以使用匿名写法
for(int i = 0; i< 20;i++) {
System.out.println("一边开车");
}
}
}