一、线程和进程的区别

  在操作系统中所有运行的任务通常对应一个进程,进程是系统进行资源分配和调度的一个独立单位。线程是进程的组成部分,一个进程最少包含一个线程。并发和并行的区别是,并发指的在同一时刻内,多个指令在多个处理器上同时执行。并发指的是同一个时刻内一个只有一条指令执行,但多个进程指令被快速轮换执行。使得宏观上感觉是多个进程在同时执行。多个线程共享进程的内存资源和数据资源等。而多个进程之间不能共享内存。

  JAVA实现多线程有三种方式:1、继承thread类  2、实现runnable  3、使用Callable和future创建多线程

二、线程的使用方式

第一种方式 继承Thread

package cn.test.hf;

/**
* 继承thread实现多线程
*/
public class CreateThread extends Thread { private int i; public void run() { for (i = 0; i < 100; i++) { // 打印出当前这个线程的名称
System.out.println(this.getName() + "----" + i + "-------" + System.currentTimeMillis());
} } public static void main(String[] args) { for (; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "----" + i + "-------" + System.currentTimeMillis());
if (i == 20) { // 创建两个线程
CreateThread thread1 = new CreateThread();
thread1.start();
CreateThread thread2 = new CreateThread();
thread2.start();
}
} }
}

从结果可以看出,当主线程跑到i=20的时候,开始去执行子线程,同时主线程还是在运行着(是否分配了不同的CPU,那么就是并发的运行,如果是单个的话那么就是时间片轮转)。使用继承thread类的方式去实现多线程,实例变量不能共享。类变量可以共享。

第二种方式:实现Runnable

  

package cn.test.hf;

public class RunnableTest implements Runnable {

    public void run() {

        System.out.print("线程名称:" + Thread.currentThread().getName());
} public static void main(String[] args) { RunnableTest r = new RunnableTest();
new Thread(r,"线程1").start();
new Thread(r,"线程2").start();
}
}
这种方式由于使用的是同一个对象,所以实例遍历可以共用。 第三种方式:实现Callable接口,这种实现多线程的方式和runnable类似,只不过Callable方式会带有返回值。
package cn.test.hf;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; public class CallableTest implements Callable { public Object call() throws Exception { return 1;
} public static void main(String[] args) { try {
CallableTest call = new CallableTest();
FutureTask future = new FutureTask(call); new Thread(future).start();
System.out.print(future.get());
} catch (Exception e) { }
}
} 三种实现多线程的方式对比:实现Runnable和实现Callable方式的优点有1、还可以实现其他的类,可扩展。2、多个线程可以共享同一个target对象,可以共享数据。在代码结构层次可以将CPU、数据、代码分开,形成清晰的模型。
  继承Thread类实现多线程用点是编程方便。三种方式推荐使用Runnable和Callable+Future。 三、线程的生命周期
  1、新建(New)
    程序使用New创建一个线程对象后,该线程的状态处于新增状态,仅仅由JAVA虚拟机为其分配内存,初始化其成员变量的值。
  2、就绪(Runnable)
    调用线程的start方法会将线程改变为就绪状态,还差获得CPU
  3、执行(Running)
    线程就绪状态获得CPU进入执行状态。
  4、阻塞(Blocked)
    线程调用sleep方法主动放弃CPU、线程调用了阻塞式IO方法、线程试图获取一个同步监视器,但是被其他线程所持有、线程在等待某个通知、程序调用了线程的suspend方法将其挂起的时候线程会进入阻塞。阻塞的线程获得某些资源后会进入就绪状态,等待获得调度获得CPU,不会直接进入执行状态。
  5、死亡(Dead)
    线程执行完后就会消亡。使用isAlive方法可以检测线程是否死亡,新建和死亡的线程会返回false、其他的返回true。 四、控制线程
  1、join线程,Thread提供了让线程等待另一个线程的方法join()
  
package cn.test.hf;

public class RunnableTest implements Runnable {

    public void run() {

        for (int i = 0; i < 100; i++) {

            System.out.println("线程名称:" + Thread.currentThread().getName() + "=====" + i);
}
} public static void main(String[] args) { try { RunnableTest r = new RunnableTest();
Thread t1 = new Thread(r, "线程1");
t1.start();
t1.join();
Thread t2 = new Thread(r, "线程2");
t2.start();
for (int i = 0; i < 1000; i++) { System.out.println("线程名称:" + Thread.currentThread().getName() + "=====" + i);
}
} catch (Exception e) { }
}
} 2、后台线程又称为守护线程,JVM垃圾回收就是典型的一个守护线程,守护线程会在所有前台线程死亡后再死亡。使用DaemonThread可以将线程设置为后台线程。
3、线程休眠,调用sleep方法,会将线程变为阻塞状态。
4、线程让步,调用yield方法,会使线程让出CPU进入就绪状态,而不是阻塞当前线程。调用之后其他比当前线程优先级高的线程将会获得CPU。
五、线程的优先级
  子线程的优先级默认与其父线程优先级一致,main主线程的优先级为普通优先级,通过Thread的setPriority方法可以设置线程的优先级,范围为1-10.
 

JAVA线程基础概念及使用的更多相关文章

  1. Java线程:概念与原理

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  2. Java多线程--基础概念

    Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...

  3. Java并发基础概念

    Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共 ...

  4. java 线程​基本概念 可见性 同步

    开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于J ...

  5. 线程之一:JAVA线程基础

    参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流. (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程:轻量 ...

  6. 线程之一:JAVA线程基础 分类: B1_JAVA 2013-10-10 12:48 662人阅读 评论(0) 收藏

    参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流.   (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程: ...

  7. Java 线程基础

    Java 线程基础

  8. Java线程基础知识(状态、共享与协作)

    1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...

  9. Java线程:概念与使用

    Java线程大总结 原文章地址:一篇很老的专栏,但是现在看起来也感觉深受启发,知识点很多,很多线程特点我没有看,尴尬.但是还是整理了一下排版,转载一下. 操作系统中线程和进程的概念 在现代操作系统中, ...

随机推荐

  1. JDBC之批量处理

    JDBC之批量处理 一.批量处理JDBC语句提高处理速度 当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率 ...

  2. 通过Callable接口创建线程

    通过Callable接口创建线程 一.前言 Java中创建线程的方式有四中,前两种在前面我已经详细介绍过了(Runnable和Thread),不清楚的朋友们可看这里: Java多线程之线程的启动以及J ...

  3. JavaScript 数据结构与算法之美 - 你可能真的不懂递归

    1. 前言 算法为王. 排序算法博大精深,前辈们用了数年甚至一辈子的心血研究出来的算法,更值得我们学习与推敲. 因为之后要讲有内容和算法,其代码的实现都要用到递归,所以,搞懂递归非常重要. 2. 定义 ...

  4. 互联网从此没有 BAT

    根据 Wind 数据截止2019年8月30日,中国十大互联网上市公司排名中,百度排名第 6 位市值 365 亿美元,阿里巴巴排名第一市值高达 4499 亿美元,腾讯排名第二市值 3951 亿美元. 1 ...

  5. HTTP首部字段完全解析

    http协议是前端开发人员最常接触到的网络协议.在开发过程中,尤其是调试过程中避免不了需要去分析http请求的详细信息.在这其中头部字段提供的信息最多,比如通过响应状态码我们可以直观的看到响应的大致状 ...

  6. Linux之Shell编程(16)

    读取从控制台输入的值(read): 系统函数: basename:返回完整路径最后/部分,常用于获取文件名 basename [pathname] [suffix] dirname:返回完整路径最后/ ...

  7. 理解Js的parseInt(转)

    parseInt() 方法首先查看位置 0 处的字符,判断它是否是个有效数字:如果不是,该方法将返回 NaN,不再继续执行其他操作.但如果该字符是有效数字,该方法将查看位置 1 处的字符,进行同样的测 ...

  8. https免费证书申请certbot,nginx

    官网:https://certbot.eff.org/ 下载: wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto ./certbo ...

  9. 牛客小白月赛8 - E - 诡异数字 数位DP

    牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...

  10. CodeForces 416 B Appleman and Tree DP

    Appleman and Tree 题解: 定义dp[u][1] 为以u的子树范围内,u这个点已经和某个黑点相连的方案数. dp[u][0] 为在u的子树范围内, u这个点还未和某个黑点相连的方案数. ...