一、继承Thread类创建线程类
实现步骤:1.定义继承thread的类并重写thread类中的run方法。 run方法的方法主体是线程完成的任务
2 .创建该类的实例对象
3 .调用线程对象的start方法来启动线程。
二.通过实现Runnable接口
1 .定义类以实现Runnable接口
2 .创建该类的实例对象obj
3 .将obj作为结构参数传递给Thread类实例对象。 这个对象才是真正的线程对象
4 .调用线程对象的start方法来启动线程
三.通过Callable接口创建线程
从JAVA 5开始,JAVA提供了可调用接口,这是Runnable接口的扩展版本。 Callable接口以线程执行体的形式提供call (方法,但call )方法比run (调用)方法更强大,call (调用)方法的功能如下:
1、call ) )方法可以有返回值;
2、call ) )方法可以声明抛出异常;
Callable接口是JAVA中新添加的接口,不是Runnable接口的子接口,因此Callable对象不能直接成为Thread的目标。 另一个原因是获取call (方法具有返回值,而不是直接调用call ) (在此为call ) )方法的返回值,而是将其作为线程执行体调用。
因此,JAVA5提供一个Future接口,该接口表示Callable接口中的call ()方法的返回值,向Future接口提供实现Future接口的FutureTask实现类
publicclasscallabletestimplementscallable {
公共字符串调用(throws exception )。
返回世界';
}
staticvoidmain (字符串[ ] args ) {
futuretasktask=newfuturetask (newcallabletest ) );
newthread(task ).start );
system.out.println(task.get );
}
}
上述方式的优缺点
通过继承Thread类实现多线程:
好处:
1、实现简单且要获取当前线程,可以直接使用this获取当前线程,而无需调用Thread.currentThread ()方法。
缺点:
1、线程类已经继承了Thread类,不能继承其他类
2、多个线程不能共享同一资源(如前面分析的成员变量I );
实现Runnable接口或Callable接口以实现多线程:
好处:
1、线程类只是实现了接口,也可以继承其他类
2、多个线程可以使用同一target对象。 适用于多个线程处理相同资源的情况。
缺点:
1 .用这种方式实现多线程,与第一种方式相比编程更复杂
2、要访问当前线程,必须调用Thread.currentThread ()方法。
第四种方法:使用线程池提交任务并创建线程
使用线程池的优点:
1 .线程池允许您重用线程以减少创建和销毁线程的开销
2 .任务到达时,不需要等待线程创建,而是直接执行。 提高响应速度
3 .线程池允许统一线程分配、优化和监视,以避免过多地占用系统资源。
start方法和run方法的区别:
指示只有在调用start方法时才调用线程,多线程并发的特性,即run方法的代码在不同线程中交替执行。 如果只是调用run方法,则代码将同步执行,并且必须等待run方法中的所有代码执行,然后才能继续执行调用run方法的线程中的代码
Runnable接口和Callable接口的区别:
Runnable接口的run方法的返回值是void,它只是简单地执行run方法的代码,执行是否完成,执行了多少? 我不知道。 我们所能做的只是等待这个多线程任务完成。 Callable Future接口可以获取多线程执行的结果。 如果线程很久没有返回,也可以取消结果。
wait方法立即解除锁定,而notify/notifyAll方法在线程的其馀代码执行之前不会解除对象锁定