? 一.extends Thread
class="java">package com.zan;
public class TestThread extends Thread{
private int count = 5 ;
//synchronized加锁 ,实现线程同步
//加锁的这段代码称为:互斥区或临界区
public void run(){ //也可在直接方法上加synchronized
synchronized (this) {
count--;
System.out.println("线程"+currentThread().getName() + " count--> "+ count);
}
}
public static void main(String[] args) {
/**
* 当多个线程访问TestThread的run方法时,以排队的方式进行处理(这里排对是按照CPU分配的先后顺序而定的),
* 一个线程想要执行synchronized修饰的方法里的代码:
* 1 首先要获得锁
* 2 若是拿到锁,执行synchronized代码体内容;拿不到锁,这个线程就会不断的尝试获得这把锁,直到拿到为止,
* 而且是多个线程同时去竞争这把锁。(也就是会有锁竞争的问题)
*/
TestThread thread = new TestThread();
Thread t1 = new Thread(thread,"t1");
Thread t2 = new Thread(thread,"t2");
Thread t3 = new Thread(thread,"t3");
Thread t4 = new Thread(thread,"t4");
Thread t5 = new Thread(thread,"t5");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
?
二.implements Runnable
?
package com.zan;
public class TestThread2 implements Runnable{
private int count = 5 ;
@Override
public synchronized void run() {
count--;
System.out.println("线程"+Thread.currentThread().getName() + " count--> "+ count);
}
public static void main(String[] args) {
TestThread2 thread = new TestThread2();
Thread t1 = new Thread(thread,"t1");
Thread t2 = new Thread(thread,"t2");
Thread t3 = new Thread(thread,"t3");
Thread t4 = new Thread(thread,"t4");
Thread t5 = new Thread(thread,"t5");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
?
Runnable比Thread好:1.适合资源共享? 2.java只能单继承,但可以实现多个接口。避免继承的局限
???
?