Java多线程简单入门

多线程的实现方式:

 1.继承自Thread类

public class MyThread extends Thread {

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i= 0; i<10;i++){
            System.out.println(getName() + "-->" +i);
        }
    }
}

 

public static void main(String[] args) {
        MyThread thread = new MyThread("thread-name");
        thread.start();
    }

  运行结果:

 

2.实现Runnable接口

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "--->" + i);
        }
    }
}
    public static void main(String[] args) {

        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable,"thread");
        thread.start();
    }

 

线程不安全,多个线程同时竞争一个资源,模拟一个售票的过程:

public class TicketSeller implements Runnable {
    private  int ticket = 100;

    //设置线程任务:卖票
    @Override
    public void run() {
        while(true){
            if(ticket>0){
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //票存在,卖票 ticket--
                System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
                ticket--;
            }else{
          break;
} } }

 

    public static void main(String[] args) {
        TicketSeller ticketSeller = new TicketSeller();
        Thread t1 = new Thread(ticketSeller, "售票员1");
        Thread t2 = new Thread(ticketSeller, "售票员2");
        Thread t3 = new Thread(ticketSeller, "售票员3");

        t1.start();
        t2.start();
        t3.start();
    }

 

 

 

 

存在同一张票多次售卖或买超了的情况,这就是线程不安全造成的,多个线程同时修改一个变量。

如何保持线程同步?

  1. 同步代码块
  2. 不同方法
  3. 锁机制

同步代码块

 

public class TicketSeller implements Runnable {
    private  int ticket = 100;

    Object lock = new Object();

    //设置线程任务:卖票
    @Override
    public void run() {
        synchronized (lock){
            while(true){
                if(ticket>0){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    //票存在,卖票 ticket--
                    System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
                    ticket--;
                }else {
                    break;
                }
            }
        }
    }
}

 

同步方法:

    public synchronized void methodName(){
        //可能会产生线程安全的代码
    }

锁机制

    Lock lock1 = new ReentrantLock();
    public void lockMethod(){
        lock1.lock();
        //可能会产生线程安全问题的代码
        lock1.unlock();
    }

 

运行结果:

 

线程安全问题解决

 

posted @ 2020-04-14 10:13  行云至他方  阅读(175)  评论(0编辑  收藏  举报