一、线程和进程
进程:处于运行过程中的程序,具有一定的独立功能,是系统进行资源分配和调度的一个独立单位。
特点:独立性、动态性、并发性。
线程:进程的执行单元,线程可以拥有自己的堆栈、程序计数器和局部变量,但不拥有系统资源,它与父进程的其他线程共享该线程拥有的全部资源。
一个线程可以创建和销毁另一线程,同一进程的多个线程可以并发执行。线程的调度与管理由进程本身负责完成。
多线程的优点:①进程之间不能共享内存,线程可以
②系统创建进程时需要为进程重新分配系统资源,但创建线程的代价小得多,使用多线程效率高
③java语言内置了许多多线程功能支持
二、线程的创建和启动
1、继承Thread类创建线程类
步骤:
1)创建Thread类的子类,并重写run()方法(作为线程执行体)
2)创建子类实例,即创建了线程对象
3)调用线程对象start()方法启动线程
方法: ①Thread.currentThread():返回当前正在执行的线程对象
②getName():返回调用该方法的进程名字
③setName(String name):为线程设置名字
未设置名字时,默认名字为:主线程main,其他线程:Thread-0,Thread-1 ......
使用继承Tread类的方法创建线程时,多个线程之间无法共享线程类的实例变量。
2、实现Runnable借口创建线程类
步骤:
1)定义Runnable接口实现类,并重写run()方法(作为线程执行体)
2)创建实现类实例,并以此实例作为target创建Thread对象,即线程对象。
new Thread ( new 实现类 () , "线程名" ); 线程名可省略
3)调用线程对象的start()方法启动线程
采用Runnable接口创建的多个线程可以共享线程类的实例变量。
3、使用Callable和Future创建线程
步骤:
1)创建Callable接口实现类,并实现call()方法(作为线程执行体,call方法有返回值并且可以声明抛出异常)
2)创建实现类的实例,并用FutureTask类包装该对象(FutureTask对象封装了Callable对象的call方法的返回值)
3)使用FutureTask对象作为Thread对象的target创建并启动线程
4)调用FutureTask对象的get()方法获得子线程执行结束后的返回值