多线程基础课程

在Java中要想实现多线程代码有两种手段:
一种是继承 Thread
另一种就是实现 Runnable 接口

启动线程 
如果要想正确的启动线程,是不能直接调用run()方法的,应该调用从Thread类中继承而来的start()方法,才可以启动线程。
mt1.start();  // 启动多线程
mt2.start();  // 启动多线程

启动Runnable实现的多线程
以上的代码是通过实现Runnable接口实现的多线程,但是这样一来就会有新的问题产生了,从之前的代码中可以清楚的知道,要想启动一个多线程必须要使用start()方法完成,如果继承了Thread类,则可以直接从Thread类中使用start()方法,但是现在实现的是Runnable接口,那么该如何启动多线程呢?实际上此时,还是要依靠Thread类完成启动,在Thread类中提供了以下的两个构造方法:
public Thread(Runnable target)
public Thread(Runnable target,String name)
这两个构造方法都可以接收Runnable的子类实例对象。所以就可以依靠此点启动多线程。 

 class MyThread implements Runnable {  // 实现Runnable接口

  private String name// 在类中定义一个属性

  public MyThread(String name) {  // 通过构造方法设置属性内容

  this.name = name;  // name属性赋值

  }

  public void run() {  // 覆写Runnable接口中的run()方法

  for (int i = 0; i < 10; i++) {  // 循环输出10

  System.out.println(name + "运行,i = " + i);

  }

  }

};

public class RunnableDemo01 {

  public static void main(String args[]) {

  MyThread my1 = new MyThread("线程A ");  // 实例化Runnable子类对象

  MyThread my2 = new MyThread("线程B ");  // 实例化Runnable子类对象

  Thread t1 = new Thread(my1) ;  // 实例化Thread类对象

  Thread t2 = new Thread(my2) ;  // 实例化Thread类对象

  t1.start() ;  // 启动线程

  t2.start() ;  // 启动线程

  }

};


Thread类和Runnable接口的区别
实际上Thread类和Runnable接口之间在使用上也是有所区别的,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了Runnable接口,则可以方便的实现资源的共享。 

可见,实现Runnable接口相对于继承Thread类来说,有如下显著的优势:
1 )、适合多个相同程序代码的线程去处理同一资源的情况。
2 )、可以避免由于 Java 的单继承特性带来的局限。
3 )、增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。 


后台线程 
Java程序中,只要前台有一个线程在运行,则整个java进程都不会消失,所以此时可以设置一个后台线程,这样即使Java进程结束了,此后台线程依然会继续执行。要想实现这样的操作,直接使用setDaemon()方法即可

线程的礼让 
在线程操作中,也可以使用yield()方法将一个线程的操作暂时让给其他线程执行

线程的强制运行
在线程操作中,可以使用join()方法让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行。

class MyThread implements Runnable {  // 实现Runnable接口

  public void run() {  // 覆写run()方法

  for (int i = 0; i < 50; i++) {  // 循环50

  System.out.

  println(Thread.currentThread().getName()

  + "运行 --> " + i);  // 输出线程名称

  }

  }

};

public class ThreadJoinDemo {

  public static void main(String args[]) {

  MyThread mt = new MyThread();  // 实例化对象

  Thread t = new Thread(mt, "线程");  // 实例化Thread对象

  t.start();  // 线程启动

  for (int i = 0; i < 50; i++) {  // 循环50

  if (i > 10) {  // 判断变量内容

  try {

  t.join();   // 线程t进行强制运行

  } catch (Exception e) {}  // 需要进行异常处理

  }

  System.out.println("Main 线程运行 --> " + i);

  }

  }

};




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值