实现多线程的方法
1.继承Thread,并且重写run方法(线程体)
2.实现Runnable接口,实现run方法(线程体)
必须重写run
1.继承Thread
class MyThread extends Thread{
public MyThread(String name) {
//此处调用父类的构造方法,在父类中有个构造方法可以传入名称,作为线程的名字
super(name);
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
//Thread.currentThread().getName()此方法为获取当前进程的名称
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
此时我们已经创建好了我们的线程类
运行(注意运行的时候要调用start方法)
public class ThreadTest {
public static void main(String[] args) {
//1.创建线程对象
Thread thread = new MyThread("My");
//2.调用start方法
thread.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
运行后发现,其打印是交替打印的(如果不是交替,尝试多运行几次),此时就实现了多线程
2.实现Runnable接口
class MyThread1 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
此时有人会问了,只是实现了Runnable接口,那么怎么运行呢?在这个类中又没有start方法,此时创建线程的方法进行了改变。
public class ThreadTest {
public static void main(String[] args) {
//1.创建线程对象
//此构造方法的第一个参数为一个实现Runnable接口的类,第二个参数为线程名称,注意:此处不用线程名也可
Thread thread1 = new Thread(new MyThread1(), "my1");
//2.调用start方法
thread1.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
运行后发现也是交替打印的
Runnable接口与Thread的区别
1.Runnable接口必须实现run方法,而Thread中run是个空方法,可以不重写
2.Runnable接口的实现类并不是真正的线程类,只是线程运行的目标类,要想运行必须依赖Thread类
3.Runnable适合与资源共享
扩展
这两种方法都没有实现 线程之间的数据共享,他们都是各自执行。
当使用继承Thread方法的时候需要共享一个数据的时候可以通过静态变量或者通过对象传送(因为对象传的为引用,所以他们共享一个)(两个方法都存在线程安全问题)
当通过实现Runnable接口的方式的时候
public class PrintNum {
public static void main(String[] args) {
//通过同一个Print创建线程
Print print = new Print();
Thread thread = new Thread(print, "1号:");
Thread thread1 = new Thread(print, "2号:");
thread.start();
thread1.start();
}
}
class Print implements Runnable{
int i=0;
@Override
public void run() {
for (; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
除了 0其他的都只打印一次,无重复。