zoukankan      html  css  js  c++  java
  • 利用Java实现多线程模拟生产者消费者问题

    利用Java多线程模拟实现生产者消费者问题


    • 利用Java提供的Thread类,创建继承于Thread的类。重写run()方法。
    • 注意main()方法中new的hellowolrd实例需要与这里的类名helloworld同名。
    • 此问题设置生产者为三个User线程,模拟不断登录系统,最多登录200次后结束登录。
      设置一个备份线程,作为消费者,备份每个用户登录的过程。
    • 因为要统计登陆的次数,设置了一个count和一个mutex变量,这个count因为需要三个线程使用,所以他需要mutex来控制同步,每次只能有一个线程操作count
    • 其中设置缓冲区为最大10
    • 全部备份完毕暂停备份

    具体代码如下:

    public class helloworld {	
    private final String LOCK="lock";
    private final int max=10;
    int full=0;
        int mutex=0;
        int count=0;
        int copycount=1;
    class User extends Thread
    {
    		int i;
    		User(int i)
    		{
    			this.i=i;
    		}
    	@Override
    	public void run()
    	 {
    		user();
    	 }
    	public void user() 
    		{
    		while(true) 
    		{
    		 synchronized(LOCK)
    		 {
    			while(full==max)
    			
    			{
    				try 
    				{
    				LOCK.wait();
    				}
    				catch(Exception e)
    				{
    					e.printStackTrace();
    				}
    			}
    			try {
    				if(mutex==1)
    					LOCK.wait();
    					if(count==200)
    						break;
    					mutex++;
    		    Thread.sleep(100);
    			}
    			catch(Exception e)
    			{
    				e.printStackTrace();
    			}
    			count++;
    			System.out.println("用户"+i+"登录"+count);
    			mutex--;
    			LOCK.notify();
    			full++;
    			LOCK.notify();
    		}
    	    }
    		}
    }
    	class Copy extends Thread
    	{
    		@Override
    		public void run()
    		{
    		      copy();	
    		}
    		
    		public void	copy()
    		{
    			while(true) {
    				if(copycount==201)
    				{
    					break;
    				}
    		synchronized(LOCK) {
    			while(full==0)
    			{
    				try
    				{
    					LOCK.wait();
    				}
    				catch(Exception e)
    				{
    					e.printStackTrace();
    				}
    			}
    			System.out.println("已备份"+copycount);
    			full--;
    			copycount++;
    			LOCK.notify();
    		}
    		}
    		}
    	}
    
    	public static void main(String arg[])
    	{
    		helloworld helloworld=new helloworld();
    	    User u1=helloworld.new User(1);
    	    User u2=helloworld.new User(2);
    	    User u3=helloworld.new User(3);
    	    User u4=helloworld.new User(4);
    	    Copy c=helloworld.new Copy();
    		u1.start();
    		u2.start();
    		u3.start();
    		u4.start();
    		c.start();
    	}
    }
    

    输出结果如下:

    用户1登录1
    用户1登录2
    用户1登录3
    用户1登录4
    用户1登录5
    用户1登录6
    用户1登录7
    用户1登录8
    用户1登录9
    用户1登录10
    已备份1
    已备份2
    已备份3
    已备份4
    已备份5
    已备份6
    已备份7
    已备份8
    已备份9
    已备份10
    用户4登录11
    用户4登录12
    用户4登录13
    用户4登录14
    用户4登录15
    用户4登录16
    用户4登录17
    用户4登录18
    用户4登录19
    用户4登录20
    已备份11
    已备份12
    已备份13
    已备份14
    已备份15
    已备份16
    已备份17
    已备份18
    已备份19
    已备份20
    用户1登录21
    用户1登录22
    用户1登录23
    用户1登录24
    用户1登录25
    用户1登录26
    用户1登录27
    用户1登录28
    用户1登录29
    用户1登录30
    已备份21
    已备份22
    已备份23
    已备份24
    已备份25
    已备份26
    已备份27
    已备份28
    已备份29
    已备份30
    用户1登录31
    用户1登录32
    用户1登录33
    用户1登录34
    用户1登录35
    用户1登录36
    用户1登录37
    用户1登录38
    用户1登录39
    用户1登录40
    已备份31
    已备份32
    已备份33
    已备份34
    已备份35
    已备份36
    已备份37
    已备份38
    已备份39
    已备份40
    用户1登录41
    用户1登录42
    用户1登录43
    用户1登录44
    用户1登录45
    用户1登录46
    用户1登录47
    用户1登录48
    用户1登录49
    用户1登录50
    已备份41
    已备份42
    已备份43
    已备份44
    已备份45
    已备份46
    已备份47
    已备份48
    已备份49
    已备份50
    用户1登录51
    用户1登录52
    用户1登录53
    用户1登录54
    用户1登录55
    用户1登录56
    用户1登录57
    用户1登录58
    用户1登录59
    用户1登录60
    已备份51
    已备份52
    已备份53
    已备份54
    已备份55
    已备份56
    已备份57
    已备份58
    已备份59
    已备份60
    用户1登录61
    用户1登录62
    用户1登录63
    用户1登录64
    用户1登录65
    用户1登录66
    用户1登录67
    用户1登录68
    用户1登录69
    用户1登录70
    已备份61
    已备份62
    已备份63
    已备份64
    已备份65
    已备份66
    已备份67
    已备份68
    已备份69
    已备份70
    用户1登录71
    用户1登录72
    用户1登录73
    用户1登录74
    用户1登录75
    用户1登录76
    用户1登录77
    用户1登录78
    用户1登录79
    用户1登录80
    已备份71
    已备份72
    已备份73
    已备份74
    已备份75
    已备份76
    已备份77
    已备份78
    已备份79
    已备份80
    用户1登录81
    用户1登录82
    用户1登录83
    用户1登录84
    用户1登录85
    用户1登录86
    用户1登录87
    用户1登录88
    用户1登录89
    用户1登录90
    已备份81
    已备份82
    已备份83
    已备份84
    已备份85
    已备份86
    已备份87
    已备份88
    已备份89
    已备份90
    用户1登录91
    用户1登录92
    用户1登录93
    用户1登录94
    用户1登录95
    用户1登录96
    用户1登录97
    用户1登录98
    用户1登录99
    用户1登录100
    已备份91
    已备份92
    用户1登录101
    用户1登录102
    已备份93
    已备份94
    已备份95
    已备份96
    已备份97
    已备份98
    已备份99
    已备份100
    已备份101
    已备份102
    用户2登录103
    用户2登录104
    用户2登录105
    用户2登录106
    用户2登录107
    用户2登录108
    用户2登录109
    用户2登录110
    用户2登录111
    用户2登录112
    已备份103
    已备份104
    已备份105
    已备份106
    已备份107
    已备份108
    已备份109
    已备份110
    已备份111
    已备份112
    用户1登录113
    用户1登录114
    用户1登录115
    用户1登录116
    用户1登录117
    用户1登录118
    用户1登录119
    用户1登录120
    用户1登录121
    用户1登录122
    已备份113
    已备份114
    已备份115
    已备份116
    已备份117
    已备份118
    已备份119
    已备份120
    已备份121
    已备份122
    用户1登录123
    用户1登录124
    用户1登录125
    用户1登录126
    用户1登录127
    用户1登录128
    用户1登录129
    用户1登录130
    用户1登录131
    用户1登录132
    已备份123
    已备份124
    已备份125
    已备份126
    已备份127
    已备份128
    已备份129
    已备份130
    已备份131
    已备份132
    用户4登录133
    用户4登录134
    用户4登录135
    用户4登录136
    用户4登录137
    用户4登录138
    用户4登录139
    用户4登录140
    用户4登录141
    用户4登录142
    已备份133
    已备份134
    用户1登录143
    用户1登录144
    已备份135
    已备份136
    已备份137
    已备份138
    已备份139
    已备份140
    已备份141
    已备份142
    已备份143
    已备份144
    用户3登录145
    用户3登录146
    用户3登录147
    用户3登录148
    用户3登录149
    用户3登录150
    用户3登录151
    用户3登录152
    用户3登录153
    用户3登录154
    已备份145
    已备份146
    已备份147
    已备份148
    已备份149
    已备份150
    已备份151
    已备份152
    已备份153
    已备份154
    用户2登录155
    用户2登录156
    用户2登录157
    用户2登录158
    用户2登录159
    用户2登录160
    用户2登录161
    用户2登录162
    用户2登录163
    用户2登录164
    已备份155
    已备份156
    已备份157
    已备份158
    已备份159
    已备份160
    已备份161
    已备份162
    已备份163
    已备份164
    用户4登录165
    用户4登录166
    用户4登录167
    用户4登录168
    用户4登录169
    用户4登录170
    用户4登录171
    用户4登录172
    用户4登录173
    用户4登录174
    已备份165
    已备份166
    已备份167
    已备份168
    已备份169
    已备份170
    已备份171
    已备份172
    已备份173
    已备份174
    用户1登录175
    用户1登录176
    用户1登录177
    用户1登录178
    用户1登录179
    用户1登录180
    用户1登录181
    用户1登录182
    用户1登录183
    用户1登录184
    已备份175
    已备份176
    已备份177
    已备份178
    已备份179
    已备份180
    已备份181
    已备份182
    已备份183
    已备份184
    用户3登录185
    用户3登录186
    用户3登录187
    用户3登录188
    用户3登录189
    用户3登录190
    用户3登录191
    用户3登录192
    用户3登录193
    用户3登录194
    已备份185
    已备份186
    已备份187
    已备份188
    已备份189
    已备份190
    已备份191
    已备份192
    已备份193
    已备份194
    用户2登录195
    用户2登录196
    用户2登录197
    用户2登录198
    用户2登录199
    用户2登录200
    已备份195
    已备份196
    已备份197
    已备份198
    已备份199
    已备份200
    
    
  • 相关阅读:
    Go 交叉编译
    go module 基本使用
    win10中安装Linux子系统
    VsCode/Pycharm配合python env 使用
    python virtualenv 基本使用
    Django 知识点小记
    Django中一种常见的setting与账密保存/读取方式
    win安装python模块出现依赖问题的解决方法 & No module named 'MySqldb'
    MySQL数据库文件
    如何在MySQL中分配innodb_buffer_pool_size
  • 原文地址:https://www.cnblogs.com/Trumpetertimes/p/12572291.html
Copyright © 2011-2022 走看看