[Android]Thread线程入门4--多线程
经过
[Android]Thread线程入门3--多线程 的学习,我们了解了多线程的简单概念。那么如何实现真正的多线程,让每个线程都干自己的活,互不影响呢?
图片上有4个TextView,他们各自显示着不同的数字。
看下图:
图片上有4个TextView,他们各自显示着不同的数字。
第一个起始数字是0,加1递增。
第二个起始数字是100,加1递增。
第三个起始数字是1000,加10递增。
第四个起始数字是10,加5递增。
这是如何实现的呢?
Layout布局和大部分代码和[Android]Thread线程入门3--多线程一样的。
源代码如下:
public
class
TestThreadActivity
extends
Activity
{
private MyHandler mHandler = null;;
//4个用来显示数字的TextView
private TextView mTextView1;
private TextView mTextView2;
private TextView mTextView3;
private TextView mTextView4;
private Button mButtonStart;
private Button mButtonStop;
//用来存储TextView。
private ArrayList<TextView> lstTextView = new ArrayList<TextView>();
private boolean mStop = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHandler = new MyHandler();
mTextView1 = (TextView)findViewById(R.id.txtShow1);
mTextView2 = (TextView)findViewById(R.id.txtShow2);
mTextView3 = (TextView)findViewById(R.id.txtShow3);
mTextView4 = (TextView)findViewById(R.id.txtShow4);
//将TextView存储到一个列表里。这种设计比较难看。呵呵。仅仅是举例而已。
lstTextView.add(0, mTextView1);
lstTextView.add(1, mTextView2);
lstTextView.add(2, mTextView3);
lstTextView.add(3, mTextView4);
mButtonStart = (Button)findViewById(R.id.btnStart);
mButtonStop = (Button)findViewById(R.id.btnStop);
mButtonStart.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//startThread();
startMultiThread();
}
});
mButtonStop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
stopThread();
}
});
}
private void startMultiThread()
{
//开启4个线程,每个线程的参数都不一样
//开始数字为0,加1递增。用lstTextView[0]那个TextView来显示这个数字
//即最上面那个TextView
new MyThread(0,1, 0).start();
//开始数字为100,加1递增。用lstTextView[1]那个TextView来显示这个数字
new MyThread(100,1, 1).start();
//开始数字为1000,加10递增。用lstTextView[2]那个TextView来显示这个数字
new MyThread(1000,10, 2).start();
//开始数字为10,加5递增。用lstTextView[3]那个TextView来显示这个数字
//即最下面那个TextView
new MyThread(10,5, 3).start();
}
private void stopThread()
{
mStop = true;
}
private class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
switch(msg.what)
{
case 1:
{
//根据msg传递过来的参数,取出对应的TextView,用它来显示当前的数字
TextView tv = (TextView)lstTextView.get(msg.arg2);
tv.setText(Integer.toString(msg.arg1));
break;
}
}
}
}
private class MyThread extends Thread
{
//起始数字
private int mStartPos = 0;
//当前数字
private int mCurrentPos = 0;
//以几递增
private int mInterval = 0;
//对应的TextView在lstTextView中的索引
private int mTextViewIndex = 0;
//初始化
public MyThread(int nStartPos, int nInterval,int nTextViewIndex)
{
mStartPos = nStartPos;
mInterval = nInterval;
mCurrentPos = mStartPos;
mTextViewIndex = nTextViewIndex;
}
@Override
public void run()
{
Log.i("test", "threadid=" + this.currentThread().getId());
while(!mStop)
{
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
Log.e("test", "enter run exception:" + e.getLocalizedMessage());
e.printStackTrace();
}
//当前数字加递增量
mCurrentPos += mInterval;
//Log.i("test", "enter run 2");
Message msg = Message.obtain();
msg.what = 1;
//将当前数字传递给message
msg.arg1 = mCurrentPos;
//将显示当前数字的TextView传递给message
msg.arg2 = mTextViewIndex;
//send message
mHandler.sendMessage(msg);
}
if(mStop)
this.interrupt();
}
}
}
private MyHandler mHandler = null;;
//4个用来显示数字的TextView
private TextView mTextView1;
private TextView mTextView2;
private TextView mTextView3;
private TextView mTextView4;
private Button mButtonStart;
private Button mButtonStop;
//用来存储TextView。
private ArrayList<TextView> lstTextView = new ArrayList<TextView>();
private boolean mStop = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHandler = new MyHandler();
mTextView1 = (TextView)findViewById(R.id.txtShow1);
mTextView2 = (TextView)findViewById(R.id.txtShow2);
mTextView3 = (TextView)findViewById(R.id.txtShow3);
mTextView4 = (TextView)findViewById(R.id.txtShow4);
//将TextView存储到一个列表里。这种设计比较难看。呵呵。仅仅是举例而已。
lstTextView.add(0, mTextView1);
lstTextView.add(1, mTextView2);
lstTextView.add(2, mTextView3);
lstTextView.add(3, mTextView4);
mButtonStart = (Button)findViewById(R.id.btnStart);
mButtonStop = (Button)findViewById(R.id.btnStop);
mButtonStart.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//startThread();
startMultiThread();
}
});
mButtonStop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
stopThread();
}
});
}
private void startMultiThread()
{
//开启4个线程,每个线程的参数都不一样
//开始数字为0,加1递增。用lstTextView[0]那个TextView来显示这个数字
//即最上面那个TextView
new MyThread(0,1, 0).start();
//开始数字为100,加1递增。用lstTextView[1]那个TextView来显示这个数字
new MyThread(100,1, 1).start();
//开始数字为1000,加10递增。用lstTextView[2]那个TextView来显示这个数字
new MyThread(1000,10, 2).start();
//开始数字为10,加5递增。用lstTextView[3]那个TextView来显示这个数字
//即最下面那个TextView
new MyThread(10,5, 3).start();
}
private void stopThread()
{
mStop = true;
}
private class MyHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
switch(msg.what)
{
case 1:
{
//根据msg传递过来的参数,取出对应的TextView,用它来显示当前的数字
TextView tv = (TextView)lstTextView.get(msg.arg2);
tv.setText(Integer.toString(msg.arg1));
break;
}
}
}
}
private class MyThread extends Thread
{
//起始数字
private int mStartPos = 0;
//当前数字
private int mCurrentPos = 0;
//以几递增
private int mInterval = 0;
//对应的TextView在lstTextView中的索引
private int mTextViewIndex = 0;
//初始化
public MyThread(int nStartPos, int nInterval,int nTextViewIndex)
{
mStartPos = nStartPos;
mInterval = nInterval;
mCurrentPos = mStartPos;
mTextViewIndex = nTextViewIndex;
}
@Override
public void run()
{
Log.i("test", "threadid=" + this.currentThread().getId());
while(!mStop)
{
try
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
Log.e("test", "enter run exception:" + e.getLocalizedMessage());
e.printStackTrace();
}
//当前数字加递增量
mCurrentPos += mInterval;
//Log.i("test", "enter run 2");
Message msg = Message.obtain();
msg.what = 1;
//将当前数字传递给message
msg.arg1 = mCurrentPos;
//将显示当前数字的TextView传递给message
msg.arg2 = mTextViewIndex;
//send message
mHandler.sendMessage(msg);
}
if(mStop)
this.interrupt();
}
}
}