1. Runnable和Thread的区别?
这两个都是可以实现多线程功能的。所以他们的区别并不是性能上 功能上的区别,而是书写方式,代码可维护性,松耦合性 以及操作方便等方便的区别了。
-
Runnable 是接口。Thread 是类,且实现了Runnable接口。
-
通过继承Thread类的方式,可以完成多线程的建立。但是这种方式有一个局限性,如果一个类已经有了自己的父类,就不可以继承Thread类,因为java是单继承。
-
所以,通常创建线程都用第二种方式。
因为实现Runnable接口可以避免单继承的局限性。 -
实现Runnable接口可以避免单继承的局限性,继承Thread是可以对Thread类中的方法进行子类复写的。
如果不需要做这个复写动作的话,只为定义线程代码存放位置,实现Runnable接口更方便一些。因为Runnable接口将线程要执行的任务封装成了对象。
2. JAVA 继承Thread 实现多线程资源共不共享?
Tread方式实现多线程,并访问变量,不好做共享
是 '不好 ' 实现 资源共享 ,而不是 不能实现资源共享 !!!
1.Thread实现多线程,不共享变量
public class Main {
public static void main(String[] args) {
MyThread T1 = new MyThread();
MyThread T2 = new MyThread();
T1.start();
T2.start();
}
}
class MyThread extends Thread {
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"卖票"+ticket--);
}
try {
sleep(1000); //休眠1秒,避免太快导致看不到同时执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
每个线程自己卖自己的票, 就是 每个线程 10个票 ,不同资源不同执行
2.Thread实现多线程,并共享变量
public class Main {
public static void main(String[] args) {
MyThread myThread= new MyThread();
new Thread(myThread).start();
new Thread(myThread).start();
}
}
class MyThread extends Thread {
private int ticket = 10;
@Override
//记得要资源公共,要在run方法之前加上synchronized关键字,要不然会出现抢资源的情况
public synchronized void run() {
for (int i = 0; i < 10; i++) {
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"卖票"+ticket--);
}
try {
sleep(1000); //休眠1秒,避免太快导致看不到同时执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
两个线程都执行一个任务,并且添加了synchronized关键字保证线程安全, 就是 两个线程 抢10个票 ,同资源同执行
3.Runable实现多线程,并共享变量
public class Main {
public static void main(String[] args) {
//测试Runnable
MyThread myThread = new MyThread();
new Thread(myThread).start();
new Thread(myThread).start();
}
}
class MyThread implements Runnable{
private int ticket = 10;
@Override
//记得要资源公共,要在run方法之前加上synchronized关键字,要不然会出现抢资源的情况
public synchronized void run() {
for (int i = 0; i <10; i++) {
if (this.ticket>0) {
System.out.println("卖票:ticket"+this.ticket--);
}
}
}
}
一般推荐使用Runable方式
3.思考
点进去看看 Thread 的源码 ,其实就是实现了Runable
继承Thread类 和 实现 Runnable接口本质都可以实现资源共享
public class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
private static native void registerNatives();
static {
registerNatives();
}