1.创建和启动线程
传统有两种方式:(还有一种不常用)
方式1:继承Thread类;方式2:实现Runnable接口;
----------------------------------------------------------------
线程类(java.lang.Thread): Thread类和Thread的子类才能称之为线程类. 阅读API.
别忘了主线程(main方法运行,表示主线程).
方式1:继承Thread类:
-----------------------------------------------------------------
步骤:
1):定义一个类A继承于java.lang.Thread类.
2):在A类中覆盖Thread类中的run方法.
3):我们在run方法中编写需要执行的操作---->run方法里的,线程执行体.
4):在main方法(线程)中,创建线程对象,并启动线程.
创建线程类对象: A类 a = new A类();
调用线程对象的start方法: a.start();//启动一个线程
注意:千万不要调用run方法,如果调用run方法好比是对象调用方法,依然还是只有一个线程,并没有开启新的线程.
//播放音乐线程类
class MusicThread extends Thread {
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("播放音乐" + i);
}
}
}
//主线程类
public class ThreadDemo3 {
public static void main(String[] args) {
//启动播放音乐的线程
MusicThread thread1 = new MusicThread();
thread1.start();
//主线程
for (int i = 0; i < 50; i++) {
System.out.println("打游戏" + i);
}
}
}
方式2:实现Runnable接口;
----------------------------------------------------------------
步骤:
1):定义一个类A实现于java.lang.Runnable接口,注意A类不是线程类.
2):在A类中覆盖Runnable接口中的run方法.
3):我们在run方法中编写需要执行的操作---->run方法里的,线程执行体.
4):在main方法(线程)中,创建线程对象,并启动线程.
创建线程类对象: Thread t = new Thread(new A());
调用线程对象的start方法: t.start();
//播放音乐线程类
class MusicRunnable implements Runnable {
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("播放音乐" + i);
}
}
}
//主线程类
public class ThreadDemo4 {
public static void main(String[] args) {
//启动播放音乐的线程
MusicRunnable musicThread = new MusicRunnable();
Thread thread1 = new Thread(musicThread);
thread1.start();
//主线程
for (int i = 0; i < 50; i++) {
System.out.println("打游戏" + i);
}
}
}
使用匿名内部类来创建线程:只适用于某一个类只使用一次的情况.
继承Thread类的方式:
public class ThreadDemo6 {
public static void main(String[] args) {
//匿名内部类启动一个线程
new Thread() { //继承Thread类的方式
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("播放音乐" + i);
}
}
}.start();
//主线程
for (int i = 0; i < 50; i++) {
System.out.println("打游戏" + i);
}
}
}
实现Runnable接口的方式:
public class ThreadDemo5 {
public static void main(String[] args) {
//匿名内部类启动一个线程
new Thread(new Runnable() { //实现接口的方式
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("播放音乐" + i);
}
}
}).start();
//主线程
for (int i = 0; i < 50; i++) {
System.out.println("打游戏" + i);
}
}
}
2.分析继承方式和实现方式的区别
-------------------------------------------------------------------------------------继承方式:
1):Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了.
2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)
3):从多线程共享同一个资源上分析,继承方式不能做到(不考虑使用静态变量).
实现方式:
1):Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口(设计上,更优雅).
2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用.
3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源).