多线程的概念:
多线程指在单个程序中中可以运行多个同的线程,执行不同的任务,多线程意味着程序的多行语句可以看上去几乎在同一时间运行。
线程与进程的相似之处。线程是一段可以完成特定功能的代码,是程序中单个顺序的流控制,但与进程不同的是,同类的线程共享一块内存空间和一组系统资源,所以系统在各个系统之间切换的时候资源占用比进程少的多,正因为如此,线程被称为轻量级进程,一个进程可以包含多个线程
java 中的线程:
java 中的线程由java.lang.thread 类,当生成一个Thread对象的时候,一个新的线程就产生了,java中的每个线程都是通过特定的Thread对象的run方法来实现其操作的,方法run称为线程体
public Thread()
public Thread(Runnable runnable)
public Thread(Runnable runnable,String name)
public Thread(String name)
参数runnable 是一个实现了Runnable接口的实例,他的作用是实现了Runnable 的run方法,目标runnable可以为null表示由本身实例来执行线程,name参数为指定线程名称但没有指定线程的构造方法,线程的名称由JVM分配的。
1.java中实现线程的方式
在java中实现线程由两种方法:一种是继承线程类的Thread,一种是实现Runnable接口
public class chapter8_1 extends Thread {
boolean isRunning = true;
int timer = 0;
/**
* 线程体代码
*/
@Override
public void run() {
while (isRunning) {
try {
Thread.currentThread().sleep(1000);
timer++;
System.out.println("逝去了 "+timer+" 秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
chapter8_1 t1 = new chapter8_1();
t1.start();
System.out.println("计时器启动...");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
String line = br.readLine();
if (line.equalsIgnoreCase("1")) {
t1.isRunning = false;
/*t1.stop();*/
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在main方法中new chapter8_1创建新的子线程,并且通过t1,start()启动子线程,main方法所在的为子线程,主线程负责管理其他的子线程
子线程启动之后就开始调用run方法,run方法是一个线程体,我们在子线程中处理事情就是在这里编写代码实现
Android中的多线程
在android中多线程应用的非常的广泛,在UI更新,游戏更新界面,和耗时处理,网络请求上面等都需要多线程
主线程与子线程的职责,主线程的职责是创建,显示,更新UI控件,子线程的职责是计算逝去的时间和与主线程发送更新UI的通知,而不是直接更新UI
主线程的职责是,显示UI,处理UI事件,启动子线程,停止子线程,更新UI,子线程如何发送通知,通知告诉主线程更新UI,线程之间的通信是如何进行的
在android中线程通信有两个对象,Message(消息)MessageQueue(消息队列)可以实现线程之间的通信
public class chapter8_4 extends Activity {
private String TAG = "chapter8_3";
private Button btnEnd;
private TextView labelTimer;
private Thread clockThread;
private boolean isRunning = true;
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnEnd = (Button) findViewById(R.id.btnEnd);
btnEnd.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
isRunning = false;
}
});
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
labelTimer.setText("逝去了 " + msg.obj + " 秒");
}
}
};
labelTimer = (TextView) findViewById(R.id.labelTimer);
/* 线程体是Clock对象本身,线程名字为"Clock" */
clockThread = new Thread(new Runnable() {
@Override
public void run() {
int timer = 0;
while (isRunning) {
try {
Thread.currentThread().sleep(1000);
timer++;
/* labelTimer.setText("逝去了 " + timer + " 秒"); */
Message msg = new Message();
msg.obj = timer;
msg.what = 0;
handler.sendMessage(msg);
Log.d(TAG, "lost time " + timer);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
clockThread.start(); /* 启动线程 */
}
有时候为了代码的紧凑,会把线程的创建和启动写在一条语句中,如下:
new Thread() {
@Override
public void run() {
int timer = 0;
while (isRunning) {
ry {
Thread.currentThread().sleep(1000);
timer++;
/ labelTimer.setText("逝去了 " + timer + " 秒");
Message msg = new Message();
msg.obj = timer;
msg.what = 0;
handler.sendMessage(msg);
Log.d(TAG, "lost time " + timer);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
第一份代码的虽然晦涩难懂,而且违背了javav的编程规范,程序结构也比较混乱,但是确实android的习惯写法,这主要是源于android追求减少字节码的追求
转载自:http://software.intel.com/zh-cn/articles/android-0/?utm_campaign=优快云&utm_source=intel.youkuaiyun.com&utm_medium=Link&utm_content=%20intelandroid%20%E2%80%93%20duoxianchengutm_campaign=优快云&utm_source=intel.youkuaiyun.com&utm_medium=Link&utm_content=%20intelandroid%20%E2%80%93%20duoxiancheng