Java多进程-(4)进程的创建、实施、Runnable和Thread版权声明

原创
小哥 3年前 (2022-10-28) 阅读数 271 #JAVA
文章标签 javajava教程

1.定义线程

在Java实现多线程有两种方式:

1、扩展java.lang.Thread类

2、实现java.lang.Runnable接口

2.实例化线程

1,如果是分机java.lang.Thread类的线程,然后直接。new即可。

2如果它实现了java.lang.Runnable类的接口,然后使用Thread施工方法:

Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)

3.启动线程

在线程的Thread对对象的调用start()方法,而不是run()或者别的什么。

在调用start()在该方法之前:线程处于新状态,新状态意味着存在一个新状态。Thread对象,但还不是真正的线程。

在调用start()方法之后:发生了一系列复杂的事情。

启动新的执行线程(使用新的调用堆栈);

线程从新状态移动到可运行状态;

当线程有机会执行时,它的目标是。run()方法将运行。

注意:对Java来说,run()这种方法没有什么特别之处。喜欢main()方法,只是新线程知道调用的方法名。(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但不会启动新的线程。

4.一些常见问题

1,线程名,一个运行的线程总是有一个名字,这个名字有两个来源,一个是虚拟机本身给出的名字,一个是你自己的名字。在没有线程名称的情况下,虚拟机始终为线程指定名称,而主线程的名称始终为mian,非主线程的名称是不确定的。

2,线程可以设置名称,也可以获取线程的名称,即使是主线程也不例外。

3获取当前线程的对象的方法如下:Thread.currentThread();

4在上面的代码中,只能保证每个线程都会启动,每个线程都会运行到完成。按某种顺序启动的一系列线程并不意味着它们将按该顺序执行。对于任何一组启动线程,调度程序无法保证其执行顺序和持续时间。

5,当线程的目标run()该线程在该方法结束时完成。

6线程一旦启动,就再也不能重新启动了。只能启动一个新线程,并且只能启动一次。可以重新启动可运行线程或死线程。

7,线程的调度是JVM部分CPU在机器上,一次只能运行一个线程。一次只执行一个线程堆栈。JVM线程调度程序确定哪个线程实际在可运行状态下运行。

许多可运行线程中的一个将被选为当前线程。不能保证选择运行可运行线程的顺序。

8,虽然通常是以队列的形式,但这并不能保证。队列形式意味着当一个线程完成一次“循环”时,它移动到可运行队列的末尾,并等待,直到它最终排队到队列的前端,然后才能再次选择它。事实上,我们称它为Runnable池而不是Runnable队列,这是为了帮助理解这样一个事实,即线程并不都以某种保证的顺序运行一个队列。

9虽然我们无法控制线程调度程序,但我们可以通过其他方式影响线程调度。

五、Runnable和Thread

Runnable是接口,Thread是类,Thread类实现了Runnable接口

这两种实施之间的区别和联系:
在程序开发中,只要是多线程的,就一定会永远实现。Runnable接口占主导地位,因为实现Runnable接口与继承的比较Thread课程有以下好处:
1避免了点继承的限制,一个类可以继承多个接口。

2,适合资源共享(例如,多个线程同时售票的问题。)

以下是票务的示例:

如果用Thread类实现:

  1. public class TestThread {

  2. static class SellThread extends Thread {

  3. private int ticket = 10;

  4. @Override

  5. public void run() {

  6. for (int i = 0; i < 20; i++) {

  7. if (ticket > 0) {

  8. System.out.println("卖票:" + ticket--);

  9. }

  10. }

  11. }

  12. }

  13. public static void main(String[] args) {

  14. SellThread thread0 = new SellThread();

  15. SellThread thread1 = new SellThread();

  16. SellThread thread2 = new SellThread();

  17. thread0.start();// 每条线都卖出了10张,总共卖出了30张票

  18. thread1.start();// 但实际只有10门票,每个线程都卖自己的票

  19. thread2.start();// 未达到资源共享

  20. }

  21. }

输出如下,显然存在问题:

如果用Runnable实现:

  1. public class TestRunnable {

  2. static class SellRunnable implements Runnable {

  3. private int ticket = 10;

  4. @Override

  5. public void run() {

  6. for (int i = 0; i < 20; i++) {

  7. synchronized (this) {

  8. if (ticket > 0) {

  9. System.out.println("卖票:" + ticket--);

  10. }

  11. }

  12. }

  13. }

  14. }

  15. public static void main(String[] args) {

  16. SellRunnable runnable = new SellRunnable();

  17. Thread thread0 = new Thread(runnable);

  18. Thread thread1 = new Thread(runnable);

  19. Thread thread2 = new Thread(runnable);

  20. thread0.start();

  21. thread1.start();

  22. thread2.start();

  23. // 虽然现在程序中有三个线程,但它们都是出售的。10张票

  24. // 使用Runnable多线程可以达到资源共享的目的。

  25. }

  26. }

输出如下,正确:

相关引文:

http://lavasoft.blog.51cto.com/62575/27069

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门