java线程的创建_笔记

进程的概念进程是处于运行过程中的程序,并且有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位。包含三个特征:独立性、动态性、并发性。

注意:并发性和并行性是两个概念:并行指在同一时刻,有多条指令在多个处理器上同时执行;并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。

线程的概念线程是进程的执行单元

1.    线程在程序中是独立的、并发的执行流,当进程被初始化后,主线程就被创建了。

2.    线程时进程的组成部分,一个进程可以拥有多个线程。

3.    线程时独立运行的,它并不知道进程中是否还有其他线程存在。

4.   多个线程共享父进程里的全部资源。

5.   线程的执行是抢占式的。线程的调度和管理由进程本身负责完成的。


java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码)。

一、通过继承Thread类来创建并启动多线程的步骤如下:

(1) 定义Thread类的子类,并重写该类的run()方法,该run()方法体就代表了线程需要完成的任务。因此把run()方法称为线程执行体。

(2) 创建Thread子类的实例,即创建了线程对象。

(3) 调用线程对象的start()方法来启动多线程。

例子:

class DemoThread extends Thread
{
	//.....一些成员变量

	//重写run()方法
    public void run ()
    {
    	//重写部分
    }

    public static void main (String[] args)
    {
    	//在调用线程的方法里创建并启动线程
    	new DemoThread().start();
    }
}

二、实现Runnable接口来创建并启动多线程的步骤如下:

(1) 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2) 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

例子:

class DemoThread02 implements Runnable
{
	//.....一些成员变量

	//重写run()方法
    public void run ()
    {
    	//重写部分
    }

    public static void main (String[] args)
    {
    	//先创建Runnable实现类
    	DemoThread02 dt = new DemoThread02();
    	//通过new Thread(target,name)方法创建并启动线程
    	new Thread(dt,"新线程").start();
    }
}

以上的run()方法是没有返回值的


Callable接口像是Runnable接口的增强版,提供了一个call()方法可以作为线程执行体,call()方法比run()方法功能更强大。call()方法可以有返回值,call()方法可以声明抛出异常。因为Callable接口不是Runnable接口的子接口,所以Callable对象不能直接作为Thread的target。

三、创建并启动有返回值的线程步骤如下:

(1) 创建Callable接口的实现类,并实现call()方法,该call()方法作为线程执行体,且该方法有返回值。

(2) 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

(3) 使用FutureTask对象作为Thread对象的target创建并启动新线程。

(4) 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

 例子:

class DemoThread03 implements Callable<?>
{
	//.....一些成员变量

	//重写run()方法
    public ? run ()
    {
    	//重写部分
    	//返回的值为泛型类型
    	return ;
    }

    public static void main (String[] args)
    {
    	//先创建Callable实现类
    	DemoThread03 dt = new DemoThread03();
    	//使用FutureTask来包装Callable实现类
    	FutureTask ft = new FutureTask<?>(dt);
    	//通过new Thread(target,name)方法创建并启动线程
    	new Thread(ft,"自定义线程").start();
    }
}

创建线程的三种方式对比:

(一) 采用实现Runnable、Callable接口的方式创建线程:

优点:

1.    线程类只是实现了Runnable或者Callable接口,还可以继承其他类。

2.   在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开。

缺点:编程复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法。

(二) 采用继承Thread类的方式创建多线程:

优点:编程简单,如果需要访问当前线程,用this就可以了。

缺点:因为继承了Thread类了,所以不能继承其他父类了。

所以一般推荐采用实现Runnable、Callable接口的方式创建多线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值