使用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:”表示推出數據遍歷線程.