多线程的概念:
多线程指在单个程序中中可以运行多个同的线程,执行不同的任务,多线程意味着程序的多行语句可以看上去几乎在同一时间运行。
线程与进程的相似之处。线程是一段可以完成特定功能的代码,是程序中单个顺序的流控制,但与进程不同的是,同类的线程共享一块内存空间和一组系统资源,所以系统在各个系统之间切换的时候资源占用比进程少的多,正因为如此,线程被称为轻量级进程,一个进程可以包含多个线程
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=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20intelandroid%20%E2%80%93%20duoxianchengutm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20intelandroid%20%E2%80%93%20duoxiancheng