使用LinkedBlockingDeque 做为阻塞队列的测试对象:
/**
*
*Description:
*Author: Create by lixby on 17-9-20
*
*/
public class MainActivity extends AppCompatActivity implements Runnable, View.OnClickListener{
private static final String TAG="lixby";
private LinkedBlockingDeque<String> qeue=new LinkedBlockingDeque<String>();
private boolean interrupted=false;
private Button start,stop,exit;
private Thread t;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start= (Button) findViewById(R.id.button2);
stop= (Button) findViewById(R.id.button3);
exit= (Button) findViewById(R.id.button4);
start.setOnClickListener(this);
stop.setOnClickListener(this);
exit.setOnClickListener(this);
}
/**往Qeue中添加数据*/
private void addString(){
new Thread(new Runnable() {
@Override
public void run() {
String[] ss={"a","b","c","d","e","f"};
for (int i = 0; i < 100; i++) {
qeue.add(""+i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(interrupted){
break;
}
}
}
}).start();
}
@Override
public void run() {
while (!interrupted){
getString();
}
}
/**从Qeue中检索数据*/
private String getString(){
String s="";
try {
s=qeue.take();
} catch (InterruptedException e) {
Log.i(TAG,"InterruptedException");
interrupted=true;
e.printStackTrace();
}
Log.i(TAG,"s:"+s);
return s;
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.button2:
addString();
break;
case R.id.button3:
t=new Thread(this);
t.start();
break;
case R.id.button4:
t.interrupt();
break;
default:
break;
}
}
}
1.Demo中使用两个线程来实现多线程队列数据的操作。
2.数据添加线程实现数据添加每隔500ms,数据遍历线程使用LinkedBlockingDeque的take实现数据的阻塞遍历。
3.三个点击事件:
(1)点击Button1执行数据添加线程。
(2)点击Button2执行数据遍历线程。
(3)点击Button3执行停止并退出数据添加线程和数据遍历线程。
4.测试结果如下:
最后打印“s:”表示推出数据遍历线程.