Java总结之线程(1)
java线程是很重要的一项,所以作为java程序员必须要掌握的。
理解java线程必须先理解线程在java中的生命周期。、

1.java线程生命周期
1.new 创建一个线程 java中创建线程有三种方式,1.继承Thread类,2.继承Runnable接口,然后重写父类的run方法。
2.Runnable 线程处于就绪状态,随时可以被cpu调用。
3.Running 线程处于运行状态,此时线程正在CPU中执行。
4.Blocked 线程处于阻塞状态,由于某种原因,cpu暂时中断线程的资源。只有线程再次进入就绪状态才能重新被cpu调用,同时阻塞有三种状态
(1)等待阻塞:运行状态中的线程执行wait方法,使本线程进入等待阻塞状态。
(2)同步阻塞:线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
(3)其他阻塞:通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
(4)死亡状态:线程运行完毕或因异常终止线程,该线程结束生命周期。
2.线程的三种创建方式
(1) 继承Thread类
public class MyThread extends Thread{
public MyThread(String name){
super(name);
}
@Override
public void run() {
for(int i=0;i<100;i++)
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
(2)继承Runnable接口
public class MyRunnable implements Runnable{
private boolean stop=false;
@Override
public void run() {
for(int i=0;i<100&&!stop;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public void stopThread(){
this.stop=true;
}
}
二者的区别在于Thread继承Runnable类,然后再继承Thread类从而调用线程,而Runnable类是一个接口,通过直接继承Runnable类来实现。
同时二者在创建时还有区别
测试 Thread:
public void testThread() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
MyThread myThread1 = new MyThread("窗口1");
MyThread myThread2 = new MyThread("窗口2");
MyThread myThread3 = new MyThread("窗口3");
MyThread myThread4 = new MyThread("窗口4");
myThread1.start();
myThread2.start();
myThread3.start();
myThread4.start();
}
}
}
测试Runnable方式:
public void testRunnable() {
int i = 0;
for (i = 0; i <= 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
Runnable myRunnable = new MyRunnable();
Thread thread1 = new Thread(myRunnable);
Thread thread2 = new Thread(myRunnable);
thread1.start();
thread2.start();
}
}
}
可以看出来在继承Thread类后通过new 一个继承了Thread的MyThread类来实现线程的创建,然后通过调用Thread方法中的start()方法使线程处于就绪状态。
而继承了Runnable方法的类new一个MyRunnable 然后在将myRunnable放入new的一个Thread中,然后在通过start()方法使线程处于就绪状态。
3.继承Callable类
public class MyCallable implements Callable<Integer> {
private int i=0;
@Override
public Integer call() throws Exception {
int sum=0;
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
sum+=i;
}
return sum;
}
}
测试:
public void testCallable() {
Callable<Integer> myCallable = new MyCallable();
FutureTask<Integer> ft = new FutureTask<>(myCallable);
for (int i = 0; i <= 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 30) {
Thread thread = new Thread(ft);
thread.start();
}
}
System.out.println("主线程执行完毕");
try {
int sum = ft.get();
System.out.println("sum= " + sum);
} catch (Exception e) {
e.printStackTrace();
}
}
通过测试你会发现继承了Callable类之后会通过FutureTask类进行包装,然后再在Thread中调用,查api你会看到FutureTask类既继承了Future类又继承了Runnabl类,同时Callabl类与另外两个的区别在于call方法有返回参数。
Java总结之线程(1)的更多相关文章
- 小谈Java里的线程
今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- 【转】关于Java的Daemon线程的理解
原文地址:http://www.cnblogs.com/ChrisWang/archive/2009/11/28/1612815.html 关于Java的Daemon线程的理解 网上对Java的Dae ...
- Java四种线程池
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...
- java笔记--使用线程池优化多线程编程
使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...
- Java中的线程
http://hi.baidu.com/ochzqvztdbabcir/item/ab9758f9cfab6a5ac9f337d4 相濡以沫 Java语法总结 - 线程 一 提到线程好像是件很麻烦很复 ...
- [译]线程生命周期-理解Java中的线程状态
线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...
- Java多线程和线程池
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...
- Java并发编程:线程和进程的创建(转)
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- Java并发3-多线程面试题
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. 2) 线程和进程有什 ...
随机推荐
- NUMBER_GET_NEXT 获取编号 遇到关于按年度编号的问题
最近给财务做了一个平台,在系统创建一些特殊类型的合同,需要生成合同编号:财务要求 合同类型+公司代码 +年+三位流水号, eg:CP6008-2017001 SNRO 子对象数据元素就是 公司代码 不 ...
- 关于java和c++中的i++
看到一个题目,大概是i=i++之类. 乍一看很简单,都知道i++的先参与计算再自增, 所以i不变. 但是仔细一想, 如果i不变, 那么在赋值之后, 自增的i, 增加的是谁呢? 逻辑顺序是怎样的呢? / ...
- (jquery+ajax)省市区三级联动(封装和不封装两种方式)-----2017-05-14
首先,要实现如下图效果, 1.要理清思路: 先做出三个下拉菜单----根据第一个下拉菜单的value值获取第二个下拉列表的内容,第三个同理. 2.用到的数据库表:Chinastates表 规律:根据国 ...
- 16、Collection接口及其子接口Set和List(常用类LinkedList,ArrayList,Vector和Stack)
16.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同 ...
- Struts2 设置global timer
设置全局的timer需要在web.xml中添加servlet, 并设置load-on-startup 为 1, 然后在servlet的init()中开启timer, 具体代码如下: 1. web.xm ...
- cocoapods卸载重装 解决clone,install,search很慢的问题
电脑上面的cocoapods clone,pod install search的时候非常非常的慢,尝试了很多方法都无法解决,最后只能尝试着重装看看能不能解决问题 卸载 sudo gem uninsta ...
- 细说C#中的系列化与反系列化的基本原理和过程
虽然我们平时都使用第三方库来进行系列化和反系列化,用起来也很方便,但至少得明白系列化与反系列化的基本原理. 注意:从.NET Framework 2.0 开始,系列化格式化器类SoapFormatte ...
- Spring Controller单元测试
SpringMVC controller测试较简单,从功能角度划分,可分为两种.一种是调用请求路径测试,另一种是直接调用Controller方法测试. 调用请求路径测试 通过请求路径调用,请求需要经过 ...
- Lock(一)认识v$LOCK
v$lock列出了数据库当前拥有的锁及未完成的锁请求. Column Description ADDR 被锁对象的地址 KADDR 锁的地址 SID session id(这里特指正在锁定对象或请求去 ...
- 错误处理1: D:\a1-C++\C++作业\第五次1.cpp undefined reference to `vtable for Shape'
在编译程序的时候遇到此误,在google上查,很多地方都说是因为虚基类里面的虚拟析构函数没有提供实现导致的.但是我的已经提供了实现,也不行.最后发现是其他没有提供实现的虚函数造成的.所以,在一个虚基类 ...