join()加入某个线程**
2.join()加入某个线程
//等加入的线程运行完在运行本线程代码
public class TestJoin {
public static void main(String[] args) {
MyThread zy = new MyThread();
zy.start();
for(int i = 0;i<10;i++) {
//i=5时,加入某个线程,等加入的线程运行完再继续往下执行
if(i==5) {
try {
zy.join();
} catch (InterruptedException e) {
}
}
System.out.println("main:"+i);
}
}
}
class MyThread extends Thread{
public void run() {
for(int i =0;i<10;i++) {
System.out.println(i);
}
}
}
**synchronized **
1.同步代码块
synchronized ("对象"){}(同步代码块)写在方法里面
方法1:
public class TestSY {
private static final Object obj = new Object();
public static void main(String[] args) {
}
public void teat1() {
//用同一个对象的锁
synchronized ("obj") {
//线程安全的代码
}
}
}
方法2:
public class TestSY {
public static void main(String[] args) {
}
public void teat2() {
//用同一个对象的锁
synchronized ("abc") {
//线程安全的代码
}
}
}
2.同步方法
// 同步方法
//多个线程来访问该方法时,只有一个线程执行这个方法里面的内容
public synchronized void teat2() {
// 同步代码块
synchronized ("abc") {
}
}
解决多个线程完成一件事情的代码(线程安全的)
public class TicketDemoSY5 {
public static void main(String[] args) {
SellTicketThread4 st = new SellTicketThread4("窗口1");
SellTicketThread4 st1 = new SellTicketThread4("窗口2");
SellTicketThread4 st2 = new SellTicketThread4("窗口3");
st.start();
st1.start();
st2.start();
}
}
class SellTicketThread4 extends Thread {
private static int ticketNumber = 10;
SellTicketThread4(String name) {
this.setName(name);
}
public void run() {
while (ticketNumber > 0) {
// 指定锁存储的对象,不是要锁的元素
synchronized ("钥匙") {
// 在判断一次,解决其他线程满足循环条件进入了等待状态的问题
if (ticketNumber > 0) {
System.out.println(this.getName() + "有" + ticketNumber + "张票");
ticketNumber--;
}
}
}
}
}