经过
[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();
}
}
}