zoukankan      html  css  js  c++  java
  • 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();
        }

    运行结果:

    线程安全问题解决

  • 相关阅读:
    win10 安装python教程
    nginx http请求无法加载https的css样式
    (第二十天)[js] 写一个验证身份证号的方法
    Linux重启nginx
    (第十一天)[js] 返回到顶部的方法有哪些?把其中一个方法出来
    看了一篇闭包的,推荐一下~
    HTTP状态码
    (第十天)[js] 写一个获取当前url查询字符串中的参数的方法
    (第九天)[js] 写一个判断数据类型的方法
    (第八天)[js] 写一个加密字符串的方法
  • 原文地址:https://www.cnblogs.com/zhvip/p/12695821.html
Copyright © 2011-2022 走看看