Thread部分总结以及小例子

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介绍如有不清楚或者不对的地方,望指出,大家可以共同进步.以及有兴趣的地方大家可以一起讨论.

转载于:https://www.cnblogs.com/syyh2006/p/8950512.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器e系列和l的区别,i.e.和 e.g.的区别和使用方法

举例说明在很多文章中都有使用过&#xff0c;我想这个对大家应该并不陌生&#xff0c;但是大家知道ie和eg的区别吗&#xff0c;他们两个都是举例子的缩写词&#xff0c;但是他们之间的区别大家知道吗&#xff0c;今天我们就来介绍下这两个举例说明的缩写词到底有什么不一样。一…

django QuerySet对象转换成字典对象

今天做一个添加购物车的模块&#xff0c;在添加商品之前要先验证用户是否处于登录状态&#xff0c;前台用ajax异步发送请求&#xff0c;后台在接收到请求后从session中取出用户登录信息。 根据登录信息从用户表中查询出对应用户&#xff0c;再将状态码和用户信息返回到前台&…

通过基于JDBC的用户存储部署Identity Server

在这篇文章中&#xff0c;我将演示如何使用JDBC用户存储配置WSO2 Identity Server。 为了演示&#xff0c;我使用的是MySQL用户存储&#xff0c;但是相同的过程也适用于任何其他JDBC用户存储。 我的环境是 操作系统– Ubuntu 12.10 Java – 1.6 WSO2是4.5.0 设置MySQL数据库…

前端路由实现原理(history)

前端路由实现&#xff08;history&#xff09; 了解&#xff1a; HTML5 history新增了两个API:history.pushState和history.replaceState 两个api都接受三个参数 状态对象&#xff08;state object&#xff09;&#xff1a;一个JavaScript对象&#xff0c;与用pushState()方法…

mysql中临时表的特点_解析Mysql临时表及特点

临时表是当连接没有断开时存在&#xff0c;一旦断开就不会存在&#xff0c;临时表的数据和结构都在内存中&#xff0c;可以做个测验&#xff0c;你创建一个临时表&#xff0c;但是到响应的数据目录下并不会找到.frm文件mysql> CREATE TEMPORARY TABLE tmp_table (->->…

原生js实现一个连连看小游戏(三)-----------点击列表获取索引

需求&#xff1a;当点击一个列表时&#xff0c;我们要知道它在列表的第几项&#xff0c;即索引&#xff0c;代码实现如下&#xff1a; <!DOCTYPE html> <html> <head><title></title> </head> <body><ul id"myUl">&…

3、数组和集合

数组 ------------------------------------------------------------------ 一维数组 object Demo2 {def main(args: Array[String]): Unit {//定义数组&#xff0c;并指定长度val arr1 new Array[Int](5)arr1(0) 1arr1(2) 4printarr(arr1)//初始化并赋值val arr2 Array[…

unity 删除服务器项目,在吗?有个支持批量构建项目的好东西推荐给你

Unity Build Server是一种全新的项目构建辅助工具&#xff0c;它可以指定硬件设备&#xff0c;专门用于构建项目版本&#xff0c;帮助工作室大规模构建项目&#xff0c;提高团队生产力。很多人在选择Unity时并不会首先考虑到项目构建问题&#xff0c;而随着项目变得更大、更复杂…

使用WSO2 ESB构建制造服务总线(MSB)

在开始讨论本主题之前&#xff0c;我想介绍一些制造业中常用的术语。 术语制造执行系统&#xff08;MES&#xff09;由AMR Research于1990年提出&#xff0c;从先进的制造计算机信息系统的发展&#xff0c;MES概念已经发展了近三十年。 以下是制造执行系统协会&#xff08;MES…

mysql jion 实现原理_MySQL-join的实现原理、优化及NLJ算法

案例分析&#xff1a;selectc.*fromhotel_info_original cleft joinhotel_info_collection honc.hotel_typeh.hotel_typeandc.hotel_idh.hotel_idwhereh.hotel_idis null这个sql是用来查询出 c 表中有 h 表中无的记录&#xff0c;所以想到了用 left join 的特性(返回左边全部记…

手把手教你写一份优质的前端技术简历

不知不觉一年一度的秋招又来了&#xff0c;你收获了哪些大厂的面试邀约&#xff0c;又拿了多少offer呢&#xff1f;你身边是不是有挺多人技术比你差&#xff0c;但是却拿到了很多大厂的offer呢&#xff1f;其实&#xff0c;要想面试拿offer&#xff0c;首先要过得了简历那一关。…

地兵布阵 -----------HDU-1166

C国的死对头A国这段时间正在进行军事演习&#xff0c;所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段&#xff0c;所以每个工兵营地的人数C国都掌握的一…

python笔记30-docstring注释添加变量

前言 python里面添加字符串注释非常简单&#xff0c;如何将变量放入 python 的函数注释里面呢&#xff1f; docstring也就是给代码加注释的内容了&#xff0c;python可以给函数&#xff0c;类、方法&#xff0c;模块添加注释内容&#xff0c;注释标准格式一般是三个双引号&…

无线路由器在手机上如何连接服务器,192.168.10.1路由器手机怎么设置? | 192路由网...

问&#xff1a;192.168.10.1路由器手机怎么设置&#xff1f;答&#xff1a;192.168.10.1是一个C类的私有IP地址&#xff0c;目前国产的路由器中&#xff0c;睿因路由器使用192.168.10.1作为默认登录地址。鉴于此&#xff0c;下面鸿哥使用睿因路由器来进行演示介绍。温馨提示&am…

Java Mission Control 5.2终于来了! 欢迎7u40!

自从我们上次听说这个叫做任务控制的小东西已经有一段时间了。 它从JRockit一直到现在都被重命名为Java Mission Control。 这是从HotSpot和JRockit融合战略中幸存下来的部分之一。 使用今天的Java SE 7 Update 40&#xff0c;您实际上可以再次使用它。 Java Mission Control …

webview布局适配实践

一、相关概念 1、viewport&#xff1a;移动设备&#xff08;包括webview&#xff09;用来显示网页的那一块区域&#xff1b; 2、devicePixelRatio属性(别名像素比&#xff0c;简称dpr)&#xff1a;window.devicePixelRatio 物理像素 / 独立像素(css中的px)&#xff1b; 3、rem…

mysql count 不等于_Mysql 不同的 count 区别

不同 count 的区别&#xff1a;count(*)、count(主键 id)和 count(1) 都表示返回满足条件的结果集的总行数&#xff1b;而 count(字 段)&#xff0c; 则表示返回满足条件的数据行里面&#xff0c;参数“字段”不为 NULL 的总个数。性能&#xff1a;count(主键 id)&#xff1a;I…

Python3爬虫(四)请求库的使用requests

Infi-chu: http://www.cnblogs.com/Infi-chu/ 一、基本用法&#xff1a; 1. 安装&#xff1a; pip install requests 2. 例子&#xff1a; import requests url http://www.baidu.com r requests.get(url) print(type(r)) # 类型是str&#xff08;JSON格式&#xff09; pr…

后台通过request.setAttribute向前台传值,前台如何去获取其中的对象或属性值

讲这些&#xff0c;我们先来了解一下request.setAttribute和request.setAttribute()这两种方法的作用。 request.getAttribute("nameOfObj"); 可得到jsp页面表单中输入框内的value。&#xff08;其实表单控件中的Object的name与value是存放在一个哈希表中的&#xff…

两个用于Eclipse的TCK –开源到底有什么?

早在5月&#xff0c;Oracle就向Eclipse Foundation 授予了兼容性测试奖学金 。 在过去的几天里&#xff0c;这引起了媒体的关注&#xff0c;我只是想确保我对整个过程和详细动作有所了解。 看起来像是一见钟情的简单诚实的礼物实际上具有更多的方面。 但让我们从头开始&#xf…