一 、创建线程的两种方式
1. 继承Thread
package com.zte.ThreadTest;
public class SoldTicket extends Thread {
static int tickets = 50;
static Object ob = "aa";
public SoldTicket(String name) {
super(name);
}
@Override
public void run() {
while (tickets > 0) {
synchronized (ob) {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "卖出第 " + tickets + " 张票");
--tickets;
} else {
System.out.println(super.getName() + "卖完了");
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
SoldTicket t1 = new SoldTicket("窗口一");
SoldTicket t2 = new SoldTicket("窗口二");
SoldTicket t3 = new SoldTicket("窗口三");
t1.start();
t2.start();
t3.start();
}
}
console-----------------------------------
窗口一卖出第 50 张票
窗口一卖出第 49 张票
窗口一卖出第 48 张票
窗口一卖出第 47 张票
窗口一卖出第 46 张票
窗口一卖出第 45 张票
窗口一卖出第 44 张票
窗口一卖出第 43 张票
窗口一卖出第 42 张票
窗口一卖出第 41 张票
窗口一卖出第 40 张票
窗口一卖出第 39 张票
窗口一卖出第 38 张票
窗口一卖出第 37 张票
窗口一卖出第 36 张票
窗口一卖出第 35 张票
窗口一卖出第 34 张票
窗口一卖出第 33 张票
窗口一卖出第 32 张票
窗口一卖出第 31 张票
窗口一卖出第 30 张票
窗口一卖出第 29 张票
窗口一卖出第 28 张票
窗口一卖出第 27 张票
窗口一卖出第 26 张票
窗口一卖出第 25 张票
窗口一卖出第 24 张票
窗口一卖出第 23 张票
窗口一卖出第 22 张票
窗口一卖出第 21 张票
窗口一卖出第 20 张票
窗口一卖出第 19 张票
窗口一卖出第 18 张票
窗口一卖出第 17 张票
窗口一卖出第 16 张票
窗口一卖出第 15 张票
窗口一卖出第 14 张票
窗口一卖出第 13 张票
窗口一卖出第 12 张票
窗口一卖出第 11 张票
窗口一卖出第 10 张票
窗口一卖出第 9 张票
窗口一卖出第 8 张票
窗口一卖出第 7 张票
窗口一卖出第 6 张票
窗口一卖出第 5 张票
窗口一卖出第 4 张票
窗口一卖出第 3 张票
窗口一卖出第 2 张票
窗口一卖出第 1 张票
窗口三卖完了
窗口二卖完了
Process finished with exit code 0
2.继承Runable
package com.zte.ThreadTest;
public class SoldTicketImpl implements Runnable {
static int tickets = 50;
static Object ob = "aa";
@Override
public void run() {
while (tickets > 0) {
synchronized (ob) {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "卖出第 " + tickets + " 张票");
tickets--;
} else {
System.out.println(Thread.currentThread().getName() + "卖完了");
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
SoldTicketImpl t = new SoldTicketImpl();
Thread t1 = new Thread(t,"窗口一");
Thread t2 = new Thread(t,"窗口二");
Thread t3 = new Thread(t,"窗口三");
t1.start();
t2.start();
t3.start();
}
}
console---------------------------------------
窗口一卖出第 50 张票
窗口一卖出第 49 张票
窗口一卖出第 48 张票
窗口一卖出第 47 张票
窗口一卖出第 46 张票
窗口一卖出第 45 张票
窗口一卖出第 44 张票
窗口一卖出第 43 张票
窗口一卖出第 42 张票
窗口一卖出第 41 张票
窗口一卖出第 40 张票
窗口一卖出第 39 张票
窗口一卖出第 38 张票
窗口一卖出第 37 张票
窗口一卖出第 36 张票
窗口一卖出第 35 张票
窗口一卖出第 34 张票
窗口一卖出第 33 张票
窗口一卖出第 32 张票
窗口一卖出第 31 张票
窗口一卖出第 30 张票
窗口一卖出第 29 张票
窗口一卖出第 28 张票
窗口一卖出第 27 张票
窗口一卖出第 26 张票
窗口一卖出第 25 张票
窗口一卖出第 24 张票
窗口一卖出第 23 张票
窗口一卖出第 22 张票
窗口一卖出第 21 张票
窗口一卖出第 20 张票
窗口一卖出第 19 张票
窗口一卖出第 18 张票
窗口一卖出第 17 张票
窗口一卖出第 16 张票
窗口一卖出第 15 张票
窗口一卖出第 14 张票
窗口一卖出第 13 张票
窗口一卖出第 12 张票
窗口一卖出第 11 张票
窗口一卖出第 10 张票
窗口一卖出第 9 张票
窗口一卖出第 8 张票
窗口一卖出第 7 张票
窗口一卖出第 6 张票
窗口一卖出第 5 张票
窗口一卖出第 4 张票
窗口一卖出第 3 张票
窗口一卖出第 2 张票
窗口一卖出第 1 张票
窗口三卖完了
窗口二卖完了
Process finished with exit code 0
二 、对象锁
1.同步代码块
package com.zte.ThreadTest;
public class DisapperRequest implements Runnable {
static DisapperRequest dp = new DisapperRequest();
static int i = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(dp);
Thread t2 = new Thread(dp);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()){
}
System.out.println(i);
}
@Override
public void run() {
synchronized (this) {
System.out.println("我是" + Thread.currentThread().getName() + "开始");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "结束");
}
}
}
我是Thread-0开始
Thread-0结束
我是Thread-1开始
Thread-1结束
0
2.同步方法
package com.zte.ThreadTest;
public class DisapperRequest implements Runnable {
static DisapperRequest dp = new DisapperRequest();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(dp);
Thread t2 = new Thread(dp);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()){
}
}
@Override
public void run() {
method();
}
public synchronized void method(){
System.out.println("我是" + Thread.currentThread().getName() + "开始");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "结束");
}
}
我是Thread-0开始
Thread-0结束
我是Thread-1开始
Thread-1结束
二、类锁
1.静态方法类锁
package com.zte.ThreadTest;
public class DisapperRequest implements Runnable {
static DisapperRequest dp1= new DisapperRequest();
static DisapperRequest dp2= new DisapperRequest();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(dp1);
Thread t2 = new Thread(dp2);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()){
}
}
@Override
public void run() {
method();
}
public static synchronized void method(){
System.out.println("我是" + Thread.currentThread().getName() + "开始");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "结束");
}
}
我是Thread-0开始
Thread-0结束
我是Thread-1开始
Thread-1结束
2.(.class 类锁)
package com.zte.ThreadTest;
public class DisapperRequest implements Runnable {
static DisapperRequest dp1= new DisapperRequest();
static DisapperRequest dp2= new DisapperRequest();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(dp1);
Thread t2 = new Thread(dp2);
t1.start();
t2.start();
t1.join();
t2.join();
}
@Override
public void run() {
method();
}
public void method(){
synchronized(DisapperRequest.class){
System.out.println("我是" + Thread.currentThread().getName() + "开始");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "结束");
}
}
}
我是Thread-0开始
Thread-0结束
我是Thread-1开始
Thread-1结束