A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

一、四位随机验证码

package lx2;

import java.util.Random;
public class Demo5 {
        public static void main(String[] args) {

                 char[] arr={'s','b','g','h','过','傻','F','Z'};
                StringBuilder sb=new StringBuilder();
                Random  random=new Random();
                for(int i=0;i<4;i++){
                        int index=random.nextInt(arr.length);
                        sb.append(arr[index]);
                }
                System.out.println("验证码:"+sb);
        }
       
}

二、模拟QQ视频与聊天同时在执行。
package lx2;

/*
需求: 模拟QQ视频与聊天同时在执行。
*/

class TalkThread extends Thread{
       
        @Override
        public void run() {
                while(true){
                        System.out.println("hi,你好!开视频呗...");
                }
        }
}


class VideoThread extends Thread{
       
        @Override
        public void run() {
                while(true){
                        System.out.println("视频视频....");
                }
        }
}

public class Demo2 {
       
        public static void main(String[] args) {
                TalkThread talkThread = new TalkThread();
                talkThread.start();
                VideoThread videoThread = new VideoThread();
                videoThread.start();       
               
        }
}

三、 需求: 模拟3个窗口同时在售50张 票 。

问题1 :为什么50张票被卖出了150次?

出现 的原因: 因为num是非静态的,非静态的成员变量数据是在每个对象中都会维护一份数据的,三个线程对象就会有三份。
解决方案:把num票数共享出来给三个线程对象使用。使用static修饰。
问题2: 出现了线程安全问题 ?
线程 安全问题的解决方案:sun提供了线程同步机制让我们解决这类问题的。

java线程同步机制的方式:

  方式一:同步代码块

   同步代码块的格式:

    synchronized(锁对象){
     需要被同步的代码...
    }
同步代码块要注意事项:
  1. 任意的一个对象都可以做为锁对象。
  2. 在同步代码块中调用了sleep方法并不是释放锁对象的。
  3. 只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率的。
  4. 多线程操作的锁 对象必须 是唯一共享 的。否则无效。

需求: 一个银行账户5000块,两夫妻一个拿着 存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准出现线程安全问题。

  方式二:同步函数
出现线程安全问题的根本原因:
1. 存在两个或者两个以上 的线程对象,而且线程之间共享着一个资源。
2. 有多个语句操作了共享资源。

package lx2;

class SaleTicket extends Thread{
               
         static int num = 50;//票数  非静态的成员变量,非静态的成员变量数据是在每个对象中都会维护一份数据的。
         
         static Object o = new Object();
       
         public SaleTicket(String name) {
                super(name);
        }
       
        @Override
        public void run() {
                while(true){
                        //同步代码块
                        synchronized ("锁") {                               
                                if(num>0){
                                        System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");
                                        try {
                                                Thread.sleep(100);
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        num--;
                                }else{
                                        System.out.println("售罄了..");
                                        break;
                                }
                        }
                       
                }
        }               
}


public class Demo4 {
       
        public static void main(String[] args) {
                //创建三个线程对象,模拟三个窗口
                SaleTicket thread1 = new SaleTicket("窗口1");
                SaleTicket thread2 = new SaleTicket("窗口2");
                SaleTicket thread3 = new SaleTicket("窗口3");
                //开启线程售票
                thread1.start();
                thread2.start();
                thread3.start();       
        }
}

---------------------
【转载】
作者:江南233244
原文:https://blog.csdn.net/qq_3913124 ... 558?utm_source=copy


3 个回复

倒序浏览
奈斯
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马