ThreadUtils

import android.os.Handler;
import android.os.Looper;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadUtils {

    private static Handler sHandler = new Handler(Looper.getMainLooper());

    private static ExecutorService sExecutorService = Executors.newSingleThreadExecutor();

    //Runnable:任务,必须依附于某一个线程
    //Thread:线程,线程用来执行任务
    //Process:进程
    //保证r这个任务一定是在主线程中执行
    public static void runOnUiThread(Runnable r){

        if(Looper.myLooper() == Looper.getMainLooper()) {
            //主线程
            //new Thread(r).start(); 一旦new了Thread就一定是子线程
            r.run();
        } else {
            //new Thread(r).start()
            sHandler.post(r);
        }

        /*new Thread(new Runnable(){
            @Override
            public void run() {

            }
        }).start();*/
    }

    //保证r一定在子线程中得到执行
    public static void runOnSubThread(Runnable r) {
        //new Thread(r).start();
        //线程池的概念,线程池里面装的是线程,使用线程池可以达到线程的复用,提高性能
        sExecutorService.submit(r);//将r丢到线程池中,线程池中的线程就会来执行r这个任务
    }
}


import android.os.Handler;
import android.os.Looper;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class ThreadUtils {

    private static Handler sHandler = new Handler(Looper.getMainLooper());

    private static ExecutorService sExecutorService = Executors.newSingleThreadExecutor();

    //Runnable:任务,必须依附于某一个线程
    //Thread:线程,线程用来执行任务
    //Process:进程
    //保证r这个任务一定是在主线程中执行
    public static void runOnUiThread(Runnable r){

        if(Looper.myLooper() == Looper.getMainLooper()) {
            //主线程
            //new Thread(r).start(); 一旦new了Thread就一定是子线程
            r.run();
        } else {
            //new Thread(r).start()
            sHandler.post(r);
        }

        /*new Thread(new Runnable(){
            @Override
            public void run() {

            }
        }).start();*/
    }

    //保证r一定在子线程中得到执行
    public static void runOnSubThread(Runnable r) {
        //new Thread(r).start();
        //线程池的概念,线程池里面装的是线程,使用线程池可以达到线程的复用,提高性能
        sExecutorService.submit(r);//将r丢到线程池中,线程池中的线程就会来执行r这个任务
    }
}
时间: 2024-10-10 20:30:44

ThreadUtils的相关文章

线程工具类ThreadUtils

package yqw.java.util; public class ThreadUtils { /**     * showThreadInfo     *      * @return     */    public static final String showThreadInfo() { return "^^^^^^^^^^^^^^^^^^^^^^^ currentThread: name=" + Thread.currentThread().getName() + &q

Java设计模式——代理模式

前言: 上一篇说到了策略模式.单类图上来说,它和本篇要说的代理模式还真是有些像似.都需要一个公共的接口,还有一些实现类.代理类(包装类)封装了一个接口对象,提供客户端调用.这些都很类似.不过,有一个细节需要我们注意一下,那就是这里的代理类也需要去继承这里的公共接口.而在策略模式中,包装类则不需要这么做. 概述: 代理模式就是定义一个原对象的代理对象,来帮助原对象和系统之外的业务作沟通.也就是说,如果我们不能直接或是不愿直接去使用原对象,那么我们就可以使用创建一个原对象的代理来进行操作. 本文链接

WebView中session的传递

因要app中使用webview访问一个网站,但是app与服务器的沟通是使用HttpUrlConnection来完成的, 设计要求是:使用webview访问时不需要再次登陆,直接app的登陆状态. 在查询了资料后,发现可以像如下这样做: 1. 获取到HttpUrlConnection里服务器返回的session id. 2. 将此session id设置到CookieManager里即可. 完成上面两部,webview就可以利用这个session来打开制定的页面了. 以下是测试代码: privat

java多线程 -- 线程池

第四种获取线程的方法:线程池,一个 ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置. 线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法.每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数. 为了便于跨大量上下文使用,此类提供了很多可调整的参数和扩展钩子 (hook).

Java(Android)线程池 总结

一种是使用Executors工厂生产线程池:另一种是直接使用ThreadPoolExecutor自定义. Executors工厂生产线程池 Java(Android)线程池 Trinea 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new Thread吗? Java 1 2 3 4 5 6 7 newThread(newRunnable(){ @Ove

Spark Streaming源码解读之Receiver在Driver的精妙实现全生命周期彻底研究和思考

一:Receiver启动的方式设想 1. Spark Streaming通过Receiver持续不断的从外部数据源接收数据,并把数据汇报给Driver端,由此每个Batch Durations就可以根据汇报的数据生成不同的Job. 2. Receiver属于Spark Streaming应用程序启动阶段,那么我们找Receiver在哪里启动就应该去找Spark Streaming的启动. 3. Receivers和InputDStreams是一一对应的,默认情况下一般只有一个Receiver.

Handler机制原理图、源码、使用!!!!!

android的消息处理机制——Looper,Handler,Message  (原理图.源码) 转自:http://my.oschina.net/u/1391648/blog/282892 在开始讨论android的消息处理机制前,先来谈谈一些基本相关的术语. 通信的同步(Synchronous):指向客户端发送请求后,必须要在服务端有回应后客户端才继续发送其它的请求,所以这时所有请求将会在服务端得到同步,直到服务端返回请求.  通信的异步(Asynchronous):指客户端在发送请求后,不

(版本定制)第9课:Spark Streaming源码解读之Receiver在Driver的精妙实现全生命周期彻底研究和思考

本期内容: 1.Receiver启动方式的设想 2.Receiver启动源码彻底分析 一:Receiver启动方式的设想 1. Spark Streaming通过Receiver持续不断的从外部数据源接收数据,并把数据汇报给Driver端,由此每个Batch Durations就可以根据汇报的数据生成不同的Job. 2. Receiver是在Spark Streaming应用程序启动时启动的,那么我们找Receiver在哪里启动就应该去找Spark Streaming的启动. 3. Receiv

6.Spark streaming技术内幕 : Job动态生成原理与源码解析

原创文章,转载请注明:转载自 周岳飞博客(http://www.cnblogs.com/zhouyf/) Spark streaming 程序的运行过程是将DStream的操作转化成RDD的操作,Spark Streaming 和 Spark Core 的关系如下图(图片来自spark官网) Spark Streaming 会按照程序设定的时间间隔不断动态生成Job来处理输入数据,这里的Job生成是指将Spark Streaming 的程序翻译成Spark内核的RDD操作,翻译的过程并不会触发J