Thread总结:一直以来用thread比较多,一般会在同步以及ui中用到.以下对于经常用作为简单介绍.

一 实现方法:

一种直接new thread,另外一种是实现Runnable接口,在创建thread的时候将Runnable直接丢进去即可.另外从java的唯一继承性那么用runnable更适合.

Example:

public class MainActivity extends Activity {
    Thread thread1;
    Thread thread2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        operateThread();
        thread1.start();
        thread2.start();
    }

    public void operateThread(){
        Log.d("ThreadTest", "threadGroup");
        thread1 = new Thread(new Runnable(){
            public void run(){
                while(true){
                    Log.d("ThreadTest","thread_1.running: ");
                    try {
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        });
        
        class MyRunnable implements Runnable {
            public void run(){
                while(true){
                    Log.d("ThreadTest","thread_2.running: ");
                    //Thread.yield();
                    try {
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
        thread2 = new Thread(new MyRunnable());
    };

运行结果:
04-25 15:05:38.299 28518 28518 D ThreadTest: threadGroup
04-25 15:05:38.301 28518 28536 D ThreadTest: thread_1.running:
04-25 15:05:38.319 28518 28537 D ThreadTest: thread_2.running:
04-25 15:05:42.302 28518 28536 D ThreadTest: thread_1.running:
04-25 15:05:42.323 28518 28537 D ThreadTest: thread_2.running:

二.方法解说:
  run()-->线程运行时所执行的代码
   start()-->用于启动线程
   sleep(long millis)-->线程休眠,交出CPU,让CPU去执行其他的任务,然后线程进入阻塞状态,sleep方法不会释放锁
  yield()-->使当前线程交出CPU,让CPU去执行其他的任务,但不会进入阻塞状态,而是重置为就绪状态,yield方法不会释放锁.和sleep区别是sleep会阻塞会再执行,yield让出cpu后,和其它线程存在竞争状态.
  join()-->当前主线程等待其他线程执行完毕后,再来继续执行Thread.join()后面的代码
  interrupt()//中断线程,自stop函数过时之后,我们通过interrupt方法和isInterrupted()方法来停止正在运行的线程,注意只能中断已经处于阻塞的线程
   getId()-->当前线程id
   getName()/setName()-->获取和设置线程的名字
   getPriority()/setPriority()-->获取和设置线程的优先级,property用1-10整数表示,默认优先级是5,优先级最高是10,优先级高的线程被执行的机率高
  setDaemon()/isDaemo()//设置和判断是否是守护线程
  currentThread()-->静态函数获取当前线程
  wait()/notyfy/notifyAll-->他们是属于Obeject对象,不是属于线程。它们用在线程同步时synchronized语句块中。wait交出cpu,让CPU去执行其他的任务,线程进入阻塞状态,同时也会释放锁.notify()并不会让当前线程休眠,但会唤醒休眠的线程。 (notifyAll方法就会通知所有等待这个对象控制权的线程继续运行)
    eg:wait():我等会儿再用这把锁,CPU也让给你们,我先休息一会儿!notify()意思是说,我用完了,你们谁用?

 关于wait && notify的简单例子如下:
public class MainActivity extends Activity {
    Thread thread1;
    Thread thread2;
    boolean threadRunning;
    final Object object = new Object();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        operateThread();

    public void operateThread(){
        Log.d("ThreadTest", "threadGroup");
        thread1 = new Thread(new Runnable(){
            public void run(){
                synchronized (object) {
                   threadRunning = true;
                   for(int i =0;i <= 100;i++){
                       Log.d("ThreadTest","thread_1.running: i: " + i);
                       if(i== 50){
                           try {
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                       }
                   }
                   threadRunning = false;
                }
            }
        });
        thread1.start();
        
        class MyRunnable implements Runnable {
            public void run(){
             synchronized (object) {
                for(int i=0;i<100;i++){
                    Log.d("ThreadTest","thread_2.running: i: " + i);
                    if(i== 50){
                        object.notify();
                    }
                }
              }
            }
        }
        thread2 = new Thread(new MyRunnable());
        thread2.start();
04-26 10:33:32.376  4956  4956 D ThreadTest: threadGroup
04-26 10:33:32.379  4956  4976 D ThreadTest: thread_1.running: i: 0
      ......中间thread_1一直在运行,由于有object的占用
04-26 10:33:32.381  4956  4976 D ThreadTest: thread_1.running: i: 49
04-26 10:33:32.381  4956  4976 D ThreadTest: thread_1.running: i: 50//到50就释放锁,让出cpu,进入wait阻塞状态
04-26 10:33:32.381  4956  4977 D ThreadTest: thread_2.running: i: 0
      ........thread_2获取锁后运行,
04-26 10:33:32.382  4956  4977 D ThreadTest: thread_2.running: i: 50
      ........thread_2在50的时候notify持有object对象的线程后,不释放锁,以及不会让出cpu
04-26 10:33:32.382  4956  4977 D ThreadTest: thread_2.running: i: 51
04-26 10:33:32.383  4956  4977 D ThreadTest: thread_2.running: i: 99
      .......线程2执行完后线程1运行
04-26 10:33:32.384  4956  4976 D ThreadTest: thread_1.running: i: 51
04-26 10:33:32.384  4956  4976 D ThreadTest: thread_1.running: i: 52

  Thread线程主要状态
(1) New  实例化tread后就是new状态
(2) Runnable 调用start后处于runnable
(3) Running 调用start后切被cpu执行
 (4)  Blocked 调用join()、sleep()、wait()使线程处于Blocked状态
 (5)  Dead    线程的run()方法运行完毕或被中断或被异常退出,线程将会到达Dead状态

对于这些thread介绍如有不清楚或者不对的地方,望指出,大家可以共同进步.以及有兴趣的地方大家可以一起讨论.

Thread部分总结以及小例子的更多相关文章

  1. java即时通信小例子

    学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...

  2. c# BackGroundWorker 多线程操作的小例子

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

  3. c/c++ 继承与多态 文本查询的小例子(非智能指针版本)

    问题:在上一篇继承与多态 文本查询的小例子(智能指针版本)在Query类里使用的是智能指针,只把智能指针换成普通的指针,并不添加拷贝构造方法,会发生什么呢? 执行时,代码崩掉. 分析下面一行代码: Q ...

  4. c/c++ 继承与多态 文本查询的小例子(智能指针版本)

    为了更好的理解继承和多态,做一个文本查询的小例子. 接口类:Query有2个方法. eval:查询,返回查询结果类QueryResult rep:得到要查询的文本 客户端程序的使用方法: //查询包含 ...

  5. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

    最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...

  6. 【转】 Pro Android学习笔记(九七):BroadcastReceiver(1):基础小例子

    目录(?)[-] 基础小例子 发送Broadcast intent 运行情况 应用间的广播 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog ...

  7. Java多线程分批发送消息的小例子

    需求: 假设有10万个用户,现在节假日做活动,需要给每个用户发送一条活动短信,为了提高程序的效率,建议使用多线程分批发送. 这里值得注意的是: 每开一个线程都会占用CPU的资源,所以线程根据所需要的条 ...

  8. springmvc入门的第一个小例子

    今天我们探讨一下springmvc,由于是初学,所以简单的了解一下 springmvc的流程,后续会持续更新... 由一个小例子来简单的了解一下 springmvc springmvc是spring框 ...

  9. Runtime的几个小例子(含Demo)

    一.什么是runtime(也就是所谓的“运行时”,因为是在运行时实现的.)           1.runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数);  [runti ...

随机推荐

  1. android查看源码的时候看不了

    原因:未关联android中jar包源码 解决方案:导入sdk---->>resource---->>api 这样就可以在代码中查看源码了.

  2. Oracle EBS订单的流程(Order->AR)

    from:http://blog.csdn.net/pan_tian/article/details/7693447 基本流程 创建订单 路径:Order Management > Orders ...

  3. PS 图像调整算法——亮度调整

    这个算法是参考自 阿发伯 的博客,在此对 阿发伯 表示感谢, http://blog.csdn.net/maozefa 亮度调整 非线性亮度调整: 对于R,G,B三个通道,每个通道增加相同的增量. 线 ...

  4. 测试驱动开发TDD(test drive development)

    classpath,路径列表.告诉java需要加载类的存放位置, java会去搜寻.这种机制实现了动态加载. java -cp 加载类路径 执行类名   : 加载类路径可是绝对,也可以相对. 代码重构 ...

  5. 【编程练习】kmp算法代码

    代码来自: http://blog.csdn.net/v_JULY_v #include "StdAfx.h" #include <iostream> using na ...

  6. 【Android 应用开发】BluetoothServerSocket详解

    一. BluetoorhServerSocket简介 1. 继承关系 public final class BluetoothServerSocket extends Object implement ...

  7. 深入理解JNI

    深入理解JNI 最近在学习android底层的一些东西,看了一些大神的博客,整体上有了一点把握,也产生了很多疑惑,于是再次把邓大神的深入系列翻出来仔细看看,下面主要是一些阅读笔记. JNI概述 JNI ...

  8. 关于getch()函数

    从百度上得知: 这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性! 所以有这样的一个接口,那就很 ...

  9. LeetCode之旅(17)-Ugly Number

    题目: Write a program to check whether a given number is an ugly number. Ugly numbers are positive num ...

  10. obj-c编程17:键值观察(KVO)

    说完了前面一篇KVC,不能不说说它的应用KVO(Key-Value Observing)喽.KVO类似于ruby里的hook功能,就是当一个对象属性发生变化时,观察者可以跟踪变化,进而观察或是修正这个 ...