线程的创建,线程安全,线程并发问题以及解决

1:实现接口来创建线程

话不多说,直接上代码


class Watermelon implements Runnable{
    private int num=30;//西瓜的总数
    @Override
    public void run() {
        for (int i = 0; i <30 ; i++) {
            if (num>0){
                //Thread.currentThread().getName()  返回当前正在执行的线程对象的引用
                System.out.println(Thread.currentThread().getName()+"吃了编号为"+num--+"的西瓜");
            }
        }
    }
}
//实现接口创建线程   人吃西瓜比赛
public class demo02 {
    public static void main(String[] args) {
        Watermelon w = new Watermelon();
        new Thread(w,"科比").start();
        new Thread(w,"乔丹").start();
        new Thread(w,"欧文").start();
    }
}

上结果,不比比(这里由于结果太长,仅展示大部分)

可以看出没有任何的关于线程并发的问题

下面来高潮,我们来让线程睡一下来模拟网络延迟


class Watermelon implements Runnable{
    private int num=30;//西瓜的总数
    @Override
    public void run() {
        for (int i = 0; i <30 ; i++) {
            if (num>0){
                try {
                    //让线程睡一下,模拟网络延迟
                    Thread.sleep(10);
                    //Thread.currentThread().getName()  返回当前正在执行的线程对象的引用
                    System.out.println(Thread.currentThread().getName()+"吃了编号为"+num--+"的西瓜");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
//实现接口
public class demo02 {
    public static void main(String[] args) {
        Watermelon w = new Watermelon();
        new Thread(w,"科比").start();
        new Thread(w,"乔丹").start();
        new Thread(w,"欧文").start();
    }
}

上结果

可以看出,乔丹和欧文竟然吃了“鬼瓜”(0和-1)

线程并发问题由此引出,如何解决?

同步代码块方式解决线程并发问题


class Watermelon1 implements Runnable{
    private int num=30;//西瓜的总数
    @Override
    public void run() {
       //同步代码块
        for (int i = 0; i <30 ; i++) {
           synchronized (this){
               if (num>0){
                   //Thread.currentThread().getName()  返回当前正在执行的线程对象的引用
                   System.out.println(Thread.currentThread().getName()+"吃了编号为"+num+"的西瓜");
                   try {
                       //让线程睡一下
                       Thread.sleep(10);
                          } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                 num++;
               }
           }
        }
    }
}

//实现接口
public class demo03 {
    public static void main(String[] args) {
        Watermelon1 w = new Watermelon1();
        new Thread(w,"科比").start();
        new Thread(w,"乔丹").start();
        new Thread(w,"欧文").start();
    }
}

结果看出没有任何线程并发问题(不信自己运行一下)

还有一种锁机制解决线程并发问题,详情请听下回分解!

猜你喜欢

转载自blog.csdn.net/OldGrandpa/article/details/82392153