实例总结Java多线程编程的方法

所属分类: 软件编程 / java 阅读数: 23
收藏 0 赞 0 分享

1.什么时候使用多线程编程

一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞

2.实现多线程的几种方式

一种是继承Thread类重写run方法,另一种是实现Runnable接口重写run方法

启动多线程很多情况下是为了处理并发进程,此时对于部分实时性要求不是那么高的业务需求,我们还可以通过实现队列的方式,异步实现。

3.举例

继承Thread

/**
 * 
* @ClassName: ThreadByEx 
* @Description: TODO
* @author Mr.jqCheng
* @date 2018年9月26日 
* */public class ThreadByEx extends Thread{
 
  @Override  public void run() {    // TODO Auto-generated method stub
    System.out.println("我是继承线程");
  }
 
}

实现Runnable

/**
 * 
* @ClassName: ThreadByRunnable 
* @Description: TODO
* @author Mr.jqCheng
* @date 2018年9月26日 
* */public class ThreadByRunnable implements Runnable{  /*public ThreadByRunnable() {
    this.run();
    // TODO Auto-generated constructor stub
  }*/
 
  public void run() {    // TODO Auto-generated method stub
    System.out.println("我是实现进程");
  }
 
}

测试:

/**
 * 
* @ClassName: Test 
* @Description: TODO
* @author Mr.jqCheng
* @date 2018年9月26日 
* */public class Test {  public static void main(String[] args) {    // 继承Thread启动的方法
    ThreadByEx t1 = new ThreadByEx();
    t1.start();// 启动线程    // 实现Runnable启动线程的方法
    ThreadByRunnable r = new ThreadByRunnable();
    Thread t2 = new Thread(r);
    t2.start();// 启动线程    //new ThreadByRunnable();  }
 
}

运行结果:

我是继承线程

我是实现进程

ok,简单的多线程实现方式完成了,在调用start()的时候,该进程已经进入可执行状态,等待系统执行。

线程处理的几个常用方法:

void interrupt():向线程发送中断请求,线程的中断状态将会被设置为true,如果当前线程被一个sleep调用阻塞,那么将会抛出interrupedException异常。

static boolean interrupted():测试当前线程(当前正在执行命令的这个线程)是否被中断。注意这是个静态方法,调用这个方法会产生一个副作用那就是它会将当前线程的中断状态重置为false。

boolean isInterrupted():判断线程是否被中断,这个方法的调用不会产生副作用即不改变线程的当前中断状态。

static Thread currentThread() : 返回代表当前执行线程的Thread对象。

守护进程

用来服务于不是服务进程的其他所有当前进程下的所有线程

实现deamon.setDaemon(true)就行,要在线程开启之前启用

举例

package com.orange.util;
/**
 * 
 * @ClassName: Test
 * @Description: TODO
 * @author Mr.jqCheng
 * @date 2018年9月26日
 *
 */
public class Test {
  public static void main(String[] args) {
    Thread deamon2 = new Thread(new DaemonRunner2(), "otherRunner");
    deamon2.start();// 启动线程
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    Thread deamon = new Thread(new DaemonRunner(), "DaemonRunner");
    // 设置为守护线程
    deamon.setDaemon(true);
    deamon.start();// 启动线程
  }
  static class DaemonRunner implements Runnable {
    public void run() {
      // TODO Auto-generated method stub
      try {
        Thread.sleep(300);
        Thread t = Thread.currentThread();
        System.out.println(t);
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        System.out.println("进入守护线程,说明现在还有其他线程在执行");
      }
    }
  }
  static class DaemonRunner2 implements Runnable {
    public void run() {
      // TODO Auto-generated method stub
      try {
        Thread.sleep(1500);
        System.out.println("我是其他线程");
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

执行结果:

Thread[DaemonRunner,5,main]

进入守护线程,说明现在还有其他线程在执行

我是其他线程

首先,先启动其他线程,需要耗时1500ms,同时,主线程耗时1000ms后,开始进入守护线程,此时其它线程还在运行,到了守护线程,耗时300ms,其他线程仍在执行,继续往下,守护线程执行完毕

但是如果我把守护线程的300ms改成500ms,会发生什么事呢?

出现过两种情况,毕竟在临界值

1.我是其他线程

2.Thread[DaemonRunner,5,main]

进入守护线程,说明现在还有其他线程在执行

我是其他线程

更多精彩内容其他人还在看

Java数据类型的规则

这篇文章主要介绍了Java数据类型的规则的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Spring整合TimerTask实现定时任务调度

这篇文章主要介绍了Spring整合TimerTask实现定时任务调度的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解SpringMVC使用MultipartFile实现文件的上传

本篇文章主要介绍了SpringMVC使用MultipartFile实现文件的上传,本地的文件上传到资源服务器上,比较好的办法就是通过ftp上传。这里是结合SpringMVC+ftp的形式上传的,有兴趣的可以了解一下。
收藏 0 赞 0 分享

SpringMVC上传文件的三种实现方式

本篇文章主要介绍了SpringMVC上传文件的三种实现方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例

本篇文章主要介绍了微信公众帐号开发-自定义菜单的创建及菜单事件响应的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
收藏 0 赞 0 分享

浅析Java中的继承与组合

本文将介绍组合和继承的概念及区别,并从多方面分析在写代码时如何进行选择。文中通过示例代码介绍的很详细,有需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

利用反射获取Java类中的静态变量名及变量值的简单实例

下面小编就为大家带来一篇利用反射获取Java类中的静态变量名及变量值的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java启动线程的3种方式对比分析

这篇文章主要为大家对比分析了java启动线程的3种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SpringMVC上传和解析Excel方法

这篇文章主要介绍了SpringMVC上传和解析Excel方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

JAVA中String类与StringBuffer类的区别

这篇文章主要为大家详细介绍了JAVA中String类与StringBuffer类的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多