Java学习记录-多线程

163 阅读2分钟

实例一

public class Demo extends Thread {
	private String name;

	Demo(String name) {
		this.name = name;
	}

	public void run() {
		for (int x = 0; x < 10; x++) {
			System.out.println(name + "...x=" + x + "...name=" + Thread.currentThread().getName());
		}
	}

}
public class ThreadDemo {
	public static void main(String[] args) {
		Demo d1 = new Demo("小明");
		Demo d2 = new Demo("小红");
		d1.start();// 开启线程,调用run方法
		d2.start();
		System.out.println("over" + Thread.currentThread().getName());
	}

}

线程的状态

实例二

public class Demo implements Runnable {
	public void run() {
		show();
	}

	public void show() {
		for (int x = 0; x < 10; x++) {
			System.out.println("...x=" + x + "...name=" + Thread.currentThread().getName());
		}
	}
}
public class ThreadDemo2 {
	public static void main(String[] args) {
		Demo d = new Demo();
		Thread t = new Thread(d);
		t.start();// 开启线程,调用run方法
		System.out.println("over" + Thread.currentThread().getName());
	}
}

第二种方式的好处:

##实例

//实例:卖票
public class Ticket extends Thread {
	public int num = 100;//当分析对象中所具备的成员变量的值都是相同的,这是这个成员变量就可以被静态修饰
						//被static修饰的成员被所有对象共享
	public void run() {
		while (true) {
			if (num > 0) {
				System.out.println(Thread.currentThread()+"..."+num--);
			}
		}
	}

}
public class TicketDemo {
	public static void main(String[] args) {
		Ticket t1 = new Ticket();
		Ticket t2 = new Ticket();
		Ticket t3 = new Ticket();
		Ticket t4 = new Ticket();
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}

}

第二种:

public class Ticket implements Runnable {
    private int num = 100;//当分析对象中所具备的成员变量的值都是相同的,这是这个成员变量就可以被静态修饰

    //被static修饰的成员被所有对象共享
    public void run() {
        while (true) {
            if (num > 0) {
                System.out.println(Thread.currentThread() + "..." + num--);
            }
        }
    }

}
public class TicketDemo {
    public static void main(String[] args) {
        Ticket t = new Ticket();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

线程安全问题

  • 1.同步代码块
public class Ticket implements Runnable {
    private int num = 100;//当分析对象中所具备的成员变量的值都是相同的,这是这个成员变量就可以被静态修饰
    //被static修饰的成员被所有对象共享
    Object obj = new Object();

    public void run() {
        while (true) {
            synchronized (obj) {
                if (num > 0) {

                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                    }
                    System.out.println(Thread.currentThread() + "..." + num--);
                }
            }
        }
    }
public class TicketDemo {
    public static void main(String[] args) {
        Ticket t = new Ticket();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

演练:

package com.bank;

public class Bank {
    private int sum;
    Object obj = new Object();

    public void add(int num) {
        synchronized (obj) {
            sum = sum + num;
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
            }
            System.out.println("sum=" + sum);
        }
    }
}


public class Cus implements Runnable {
    private Bank b = new Bank();

    public void run() {
        for (int x = 0; x < 3; x++) {
            b.add(100);
        }
    }
}


public class BankDemo {
    public static void main(String[] args) {
        Cus c = new Cus();
        Thread t1 = new Thread(c);
        Thread t2 = new Thread(c);
        t1.start();
        t2.start();
    }
}
  • 2.同步函数

public class Bank {
    private int sum;

    public synchronized void add(int num) {//同步函数
        sum = sum + num;
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
        }
        System.out.println("sum=" + sum);

    }
}

同步函数用的锁是this

线程间通信-等待唤醒机制

线程间通信-多生产者多消费者问题