三、Thread类 Thread类包含为任务而创建的线程的构造方法,以及控制线程的方法。
Thread() //创建一个空线程
Thread(Runnable task) //为指定任务创建一个线程
public void start() //启动线程使任务的run()被JVM调用
public boolean isAlive() //测试线程当前是否正在运行,创建和结束状态时返回false,就绪、阻塞、运行状态时返回true。
public int getPriority() //得到线程的优先级,默认线程继承生成它的线程的优先级
public void setPriority(int p) //设置线程的优先级p(范围从1到10)
public void join() //使此线程等待另一个线程的结束,在另一个线程里面调用
public void sleep(long mi) //使线程睡眠指定的毫秒数
public void yield() //使线程暂停并允许执行其他线程,为其他线程临时让出SPU时间
public void interrupt() //中断线程,就绪或运行状态时给他设置一个中断标志,阻塞状态时它将被唤醒进入就绪状态并抛出InterruptedException异常。
Thread类还包含方法stop()、suspend()、resume(),由于普遍认为这些方法具有内在有不安全因素,所以不提倡使用这些方法。为替代stop()的使用可以通过给Thread变量赋值null来表明它被停止。
Thread类有int型常量MIN_PRIORITY、NORM_PRIORITY、MAX_PRIORITY,分别代表1,5,10。Java虚拟机总是选择当前优先级最高的可运行线程。如果所有可运行线程具有相同的优先级,那将会用循环队列给它们分配相同的CPU份额。但我在测试时发现并没有绝对的按优先级来调度,测试如下:
四、线程池 线程池是管理并发执行任务个数的理想方法。所以,如果需要为一个任务创建一个线程,就使用Thread类。如果需要为多个任务创建线程,最好使用线程池。
1. Executor接口 Java提供Executor接口来执行线程池中的任务,执行方法如下:
public void execute(Runnable r)
2. ExecutorService接口 ExecutorService是Executor的子接口,用来管理和控制任务,如下:
public void shutdown() //关闭执行器,但允许完成执行器中的任务,但不能接受新任务
public List shutdownNow() //关闭执行器,返回未完成任务的清单
public boolean isShutdown() //如果执行器已经被关闭则返回true
public boolean isTerminated() //如果线程池中所有的任务都被终止,则返回true。
3. Executors工具类 Java提供了Executors工具类来创建Executor对象,如下:
//1. 创建一个线程池,该线程池可并发执行的线程数固定不变。它可以被重用以执行另一个任务。如果某个线程因意外结束,线程池会补充一个新线程。
public static ExecutorService newFixedThreadPool(int n);
public static ExecutorService newFixedThreadPool(int n, ThreadFactory tf);
//2. 创建一个线程池,它可按需创建新线程,线程池大小完全依赖于操作系统或者JVM能够创建的最大线程数,但当前面创建的线程可用时,则重用它们。
public static ExecutorService newCachedThreadPool();
public static ExecutorService newCachedThreadPool(ThreadFactory tf);
//3. 创建一个线程池,它只有一个线程在工作,相当于单线程串行执行所有任务。如果该因异常结束,那么会有一个新建一个线程来代替它。此线程池保证所有任务按提交顺序执行。
public static ExecutorService newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor(ThreadFactory tf);
//4. 创建一个线程池,此线程池支持定时以及周期性执行任务的需求。
public static ScheduledExecutorService newScheduledThreadPool(int n);
public static ScheduledExecutorService newScheduledThreadPool(int n, ThreadFactory tf);
//5. 创建一个线程池,单线程串行执行,支持定时以及周期性执行任务的需求。
public static ScheduledExecutorService newSingleThreadScheduledExecutor();
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory tf);
2. 利用加锁同步 一个锁是一个Lock接口的实例,它定义了加锁和释放锁的方法。操作如下:
public void lock() //加锁
public void unlock() //释放锁
public Condition newCondition() //返回到绑定到Lock实例的新的Condition实例
六、线程间协作 通过保证在临界区上多个线程的相互排斥,线程同步完全可以避免竞争状态的发生,但是有些时候还需要线程之间的协作。使用条件可以便于线程间的通信,条件是通过调用Lock对象的newCondition()方法而创建的对象。一旦创建了条件,就可以使用await()、signal()、signlAll()方法来实现线程之间的相互通信。Condition具体操作如下:
public void await() //当前线程等待直到发生某个条件,同普通对象的wait()方法
public void signal() //唤醒一个等待线程,同普通对象的notify()方法
public Condition signalAll() //唤醒所有等待的线程,同普通对象的nofityAll()方法
示例:
十一、同步集合 Java集合框架中的类不是线程安全的,也就是说,如果它们同时被多个线程访问和更新,它们的内容可能被破坏。可以通过锁定集合或者同步集合保护集合中的数据。
Collections类提供六个静态方法将集合转成同步版本,在它里面的所有访问和更新原来的集合c的方法都被同步,使用这些方法创建的集合称为同步包装类。如下:
public Collection synchronizedCollection(Collection c) //返回同步集合
public List synchronizedList(List l) //返回同步线性表
public Map synchronizedMap(Map m) //返回同步图
public Set synchronizedSet(Set s) //返回同步规则集
public SortedMap synchronizedSortedMap(SortedMap s) //返回同步有序图
public SortedSet synchronizedSortedSet(SortedSet s) //返回同步有序规则集
在Vector、Stack、Hashtable中的方法已经被同步,它们都是java中出现的旧类,应该用ArrayList代替Vector,LinkedList代替Stack,Map代替Hashtable。如果需要同步,就使用同步包装类。需要注意的是这些包装类具有快速失败的特性。
什么是Thrift
The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and s
org.json.JSONException: No value for items
在JSON解析中会遇到一种错误,很常见的错误
06-21 12:19:08.714 2098-2127/com.jikexueyuan.secret I/System.out﹕ Result:{"status":1,"page":1,&