进程和线程的区别

进程是重量级的任务,需要分配给它们独立的地址空间。进程间通信是昂贵和受限的。进程间的转换也是很需要花费的。

另一方面,线程是轻量级的选手。它们共享地址空间并且共享同一个进程。线程间通信是便宜的,线程间的转换也是低成本的。

线程的生命周期

一个线程从创建到消亡的过程。线程的生命周期分为四个状态

1、创建状态

2、可运行状态

3、不可运行状态

4、消亡状态

线程的状态转换图

Java创建线程的三种方式: 1 继承Thread, 2.实现Runnable接口   3、实现Callable接口

一、Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

<一>. java中实现线程的方式有Thread和Runnable

Thread:

public class Thread1 extends Thread{
@Override
public void run() {
System.out.println("extend thread");
}
}

 Runnable:

public class ThreadRunable implements Runnable{

	public void run() {
System.out.println("runbale interfance"); } }

 使用

public static void main(String[] args) {
new Thread1().start();
new Thread(new ThreadRunable()).start();
}

  

<二>.Thread和Runnable区别

1.在程序开发中使用多线程实现Runnable接口为主。 Runnable避免继承的局限,一个类可以继承多个接口

2. 适合于资源的共享

如下面的例子

public class TicketThread extends Thread{

	private int ticketnum = 10;

	@Override
public void run() {
for(int i=0; i<20;i++){
if (this.ticketnum > 0) {
ticketnum--;
System.out.println("总共10张,卖掉1张,剩余" + ticketnum);
}
}
}
}

  使用三个线程

public static void main(String[] args) {
TicketThread tt1 = new TicketThread();
TicketThread tt2 = new TicketThread();
TicketThread tt3 = new TicketThread();
tt1.start();
tt2.start();
tt3.start();
}

  实际上是卖掉了30张车票

而使用Runnable,如下面的例子

public class TicketRunnableThread implements Runnable{

private int ticketnum = 10;

	public void run() {
for(int i=0; i<20;i++){
if (this.ticketnum > 0) {
ticketnum--;
System.out.println("总共10张,卖掉1张,剩余" + ticketnum);
}
}
}
}

  使用三个线程调用

public static void main(String[] args) {
TicketRunnableThread trt1 = new TicketRunnableThread();
new Thread(trt1).start();
new Thread(trt1).start();
new Thread(trt1).start();
}

  因为TicketRunnableThread是New了一次,使用的是同一个TicketRunnableThread,可以达到资源的共享。最终只卖出10张车票。

3.效率对比

public static void main(String[] args) {

		 long l1 = System.currentTimeMillis();

		    for(int i = 0;i<100000;i++){
Thread t = new Thread();
} long l2 = System.currentTimeMillis(); for(int i = 0;i<100000;i++){
Runnable r = new Runnable() {
public void run() {
}
};
} long l3 = System.currentTimeMillis(); System.out.println(l2 -l1);
System.out.println(l3 -l2);
}

  在PC上的结果

119
5

  所以在使用Java线程池的时候,可以节约很多的创建时间

二、线程池

public class MyCallable implements Callable<Object> {

    private String taskNum;

    MyCallable(String taskNum){
this.taskNum = taskNum;
} @Override
public Object call() throws Exception {
System.out.println(">>>" + taskNum + "任务启动");
Date dateTmp1 = new Date();
Thread.sleep(1000);
Date dateTmp2 = new Date();
long time = dateTmp2.getTime() - dateTmp1.getTime();
System.out.println(">>>" + taskNum + "任务终止");
return taskNum +"任务返回运行结果,当前任务执行时间[" + time + "]毫秒";
} public static void main(String[] args) throws ExecutionException, InterruptedException {
int taskSize = 5;
//创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(taskSize);
//创建多个有返回值的任务
List<Future> list = new ArrayList<>();
for(int i = 0; i< taskSize; i++){
Callable c = new MyCallable(i+ " ");
//执行任务并获取Future对象
Future f = pool.submit(c);
list.add(f);
}
pool.shutdown(); for(Future f : list){
//从Future对象获取任务的返回值
System.out.println(">>>" + f.get().toString());
} }
}

  

Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别的更多相关文章

  1. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  2. java创建线程方式

    1.继承Thread类 public class ThreadCreator extends Thread{ public static void main(String[] args) { //第一 ...

  3. java笔记线程方式2

    方式2:实现Runnable接口 * 步骤: *   A:自定义类MyRunnable实现Runnable接口 *   B:重写run()方法 *   C:创建MyRunnable类的对象 *   D ...

  4. java 创建线程方式

    1.继承Thread类 子类覆写父类中的run方法,将线程运行的代码存放在run中. 建立子类对象的同时线程也被创建. 通过调用start方法开启线程. 2.实现Runnable接口 子类覆盖接口中的 ...

  5. java笔记线程方式1获取对象名称

    * 如何获取线程对象的名称呢? * public final String getName():获取线程的名称. * 如何设置线程对象的名称呢? * public final void setName ...

  6. java笔记线程方式1线程暂停yield

    public static void yield():暂停当前正在执行的线程对象,并执行其他线程. 让多个线程的执行更和谐,但是不能靠它保证一人一次. public class ThreadYield ...

  7. java笔记线程方式1线程终端与停止

    public final void stop():让线程停止,过时了,但是还可以使用.public void interrupt():中断线程. 把线程的状态终止,并抛出一个InterruptedEx ...

  8. java笔记线程方式1等待终止

    public final void join():等待该线程终止 public class ThreadJoinDemo { public static void main(String[] args ...

  9. java笔记线程方式1优先级

    * 我们的线程没有设置优先级,肯定有默认优先级. * 那么,默认优先级是多少呢? * 如何获取线程对象的优先级? *   public final int getPriority():返回线程对象的优 ...

随机推荐

  1. c# 水晶报表的设计(非常的基础)

    最近在公司实习,由于公司需要用到的一种叫做水晶报表的神奇的东东,老大就叫我们学习学习.怕自己以后忘了,也为了以后阅读方便,将其记录下来. 使用工具:vs2008 基本方法一.使用水晶报表的推模式 步骤 ...

  2. 使用python编写一个壁纸网站的简单爬虫

    目标网站:http://www.netbian.com/ 目的:实现对壁纸各分类的第一页壁纸的获取 一:分析网站,编写代码: (ps:源代码在文章的最后) 1.获取网站目录部分的一大段代码,下一步再进 ...

  3. GridView获取CheckBox的值及所在列的ID

    //根据GridView的列数进行循环 ; i < GridView1.Rows.Count; i++) { //检查是否有ID为CheckBox1的CheckBox控件,如果有就赋值给Chec ...

  4. How to connect to Linux VM from Windows

  5. LayaAir引擎——(五)

    LayaAir引擎——关于地图详解 所需要的软件: LayaAirIDE1.0.2版本 在LayaAir引擎中与地图相关的类: 1.laya.map.TiledMap TiledMap类   地图以层 ...

  6. redis DB操作

    数据库操作 1)  REDIS是全部由KEY和VALUE值构成,对数据库的增删改查操作都是基于在通过key 映射到哈希槽 然后通过哈希槽进行单向链式遍历 查找到value和具体的key. 同样 在查看 ...

  7. 用户 NT AUTHORITY\NETWORK SERVICE 登录失败 解决方法(转载)

    用户 NT AUTHORITY\NETWORK SERVICE 登录失败 解决方法 (MS SQL 2005) Windows server 2003,2008 Web.Config 配置连接sql ...

  8. ORACLE 各种连接

    数据说明: select * from dave;ID NAME 安庆 dave bl bl dave dba sf-express dmm select * from b1;ID NAME dave ...

  9. Python 文件操作函数

    这个博客是 Building powerful image classification models using very little data 的前期准备,用于把图片数据按照教程指示放到规定的文 ...

  10. C++ 虚函数,纯虚函数的一些问题

    #include <iostream> using namespace std; #define cendl cout << endl; class AA{//这是一个纯虚函数 ...