一、线程和进程的区别

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

  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. 2016 ACM-ICPC 青岛站网络赛G题 题解

    [参考博客][https://blog.csdn.net/Tawn0000/article/details/82255682] 题意: 将n个数按照每k个一组来合并,合并需要花费的cost是两个数的长 ...

  2. Oracle - Tables

    创建表 a: Sql语句创建 -- Create table create table Table_Name ( 字段1 VARCHAR2(50), 字段2 VARCHAR2(50) not null ...

  3. Python基础学习笔记(一)python发展史与优缺点,岗位与薪资

    相信有好多朋友们都是第一次了解python吧,可能大家也听过或接触过这个编程语言.那么到底什么是python呢?它在什么机缘巧合下诞生的呢?又为什么在短短十几年时间内就流行开来呢?就请大家带着疑问,让 ...

  4. Redis设计原理

    1.简介 Redis中的每个Key-Value在内存中都会被划分成DictEntry.RedisObject以及具体对象,其中DictEntry又分别包含指向Key和Value的指针(以RedisOb ...

  5. IT项目经理入门心法

  6. Different Integers 牛客网暑期ACM多校训练营(第一场) J 离线+线状数组或者主席树

    Given a sequence of integers a1, a2, ..., an and q pairs of integers (l 1, r1), (l2, r2), ..., (lq, ...

  7. 从SpringBoot构建十万博文聊聊Tomcat集群监控

    前言 在十万博文终极架构中,我们使用了Tomcat集群,但这并不能保证系统不会出问题,为了保证系统的稳定运行,我们还需要对 Tomcat 进行有效的运维监控手段,不至于问题出现或者许久一段时间才知道. ...

  8. Oracle 优化器_表连接

    概述 在写SQL的时候,有时候涉及到的不仅只有一个表,这个时候,就需要表连接了.Oracle优化器处理SQL语句时,根据SQL语句,确定表的连接顺序(谁是驱动表,谁是被驱动表及 哪个表先和哪个表做链接 ...

  9. SpringBoot初体验之整合SpringMVC

    作为开发人员,大家都知道,SpringBoot是基于Spring4.0设计的,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程.另外Spr ...

  10. 011 实例2-Python蟒蛇绘制

    目录 一."Python蟒蛇绘制"问题分析 1.1 Python蟒蛇绘制 二."Python蟒蛇绘制"实例编写 三.运行效果 3.1 程序关键 四." ...