java基础----多线程(1)

1.线程和进程

1.什么是进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。eg:打开迅雷软件,迅雷软件在运行,就是一个进程。

2.什么是线程

线程,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。eg:迅雷软件中正在下载的任务一,任务二,就相当于线程

3.线程和进程的区别

1.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
2.进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
3.进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)

2.java创建线程的三种方式

1.继承Thread类

    package com.javaThread.day1;
    /**
    *@author caikeren
    *@version 2019年1月15日下午11:23:59
    *创建线程的方式一:继承Thread重写run方法
    */
    public class ThreadTest1 extends Thread{
    
    	//线程体
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		for(int i=0;i<10;i++) {
    			System.out.println("线程一"+this.getName()+this.getPriority());
    		}
    	}
    	
    }

2.实现Runnable接口

    package com.javaThread.day1;
    /**
    *@author caikeren
    *@version 2019年1月16日上午12:41:34
    *创建线程的方式二:实现runnable接口
    */
    public class ThreadTest2 implements Runnable{
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		for(int i=0;i<10;i++) {
    			System.out.println("线程二"+Thread.currentThread().getName());
    		}
    	}
    }

3.实现Callable接口

    package com.javaThread.day1;
    
    import java.util.Random;
    import java.util.concurrent.Callable;
    
    /**
    *@author caikeren
    *@version 2019年1月16日上午12:56:10
    *创建线程的方式三:实现callable接口
    */
    public class ThreadTest3 implements Callable<Integer> {
    
    	@Override
    	public Integer call() throws Exception {
    		// TODO Auto-generated method stub
    		return new Random().nextInt(10);
    	}
   
    }

测试,开启线程

    package com.javaThread.day1;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    /**
    *@author caikeren
    *@version 2019年1月16日上午12:34:50
    */
    public class MainTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		/**
    		 *创建线程对象,并开启线程
    		 */
    		
    		//方式一
    		Thread thread1 = new ThreadTest1();
    		thread1.start();
    		
    		//方式二
    		Runnable runnable = new ThreadTest2();
    		Thread thread2 = new Thread(runnable);
    		thread2.start();
    		
    		new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				// TODO Auto-generated method stub
    				System.out.println("匿名内部类创建线程3");
    			}
    		}).start();
    		
    		//方式三
    		Callable<Integer> callable = new ThreadTest3();
    		FutureTask<Integer> futureTask = new FutureTask<>(callable);
    		Thread thread3 = new Thread(futureTask);
    		//开启线程
    		thread3.start();
    		//得到返回值
    		try {
    			System.out.println(futureTask.get());
    		} catch (InterruptedException | ExecutionException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}
    
    }

思考,为什么Callable接口创建线程的方式是这样开启线程?
在这里插入图片描述
在这里插入图片描述

3.线程的生命周期

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值