多线程(一) 多线程介绍及基本使用

线程状态转换图

<一>多线程介绍

  程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。
  进程(process)是程序的一次执行过程,或是正在运行的一个程序。动态过程:有它自身的产生、存在和消亡的过程。
  如:运行中的QQ,运行中的MP3播放器。
  程序是静态的,进程是动态的。
  线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。
  若一个程序可同一时间执行多个线程,就是支持多线程的。

多线程程序的优点:
  提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
  提高计算机系统CPU的利用率。
  改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改。

<二>创建线程的四种方式

方式一:
①声明一个类继承 Thread 类
②重写 run() 方法,同时编写线程执行体
③创建该子类的实例
④调用 start() 方法启动线程,默认调用 run() 方法

方式二:
①声明一个类实现 Runnable 接口
②实现 run() 方法,同时编写线程执行体
③创建该实现类的实例
④创建 Thread 类的实例,将实现类的实例作为参数传递给 Thread 的构造器
⑤调用 Thread 的 start() 方法, 启动线程,默认调用 run() 方法

方式三:
class MyThread implements Callable{
@Override
public Integer call() throws Exception{
System.out.println(“come Callable-----”);
return 200;
}
}

public class ThreadDemo1 {
public static void main(String[] args){
FutureTask futureTask = new FutureTask(new MyThread());
new Thread(futureTask).start();
}
}

方式四:线程池
常见线程池:
①newSingleThreadExecutor
  单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务
②newFixedThreadExecutor(n)
  固定数量的线程池,没提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
③newCacheThreadExecutor(推荐使用)
  可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
④newScheduleThreadExecutor
  大小无限制的线程池,支持定时和周期性的执行线程

ExecutorService pool = Executors.常见线程池
例:ExecutorService pool = Executors.newSingleThreadExecutor();

<三>示例
-----实例

public class MyThread implements Runnable{

    @Override
	public void run() {   System.out.println(Thread.currentThread().getName() + "-->执行中。。。");
    }
}

(1) newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

public class TestCachedThreadPool {

    public static void main(String[] args) {
        //创建一个可重用固定线程数的线程池
        ExecutorService pool = Executors.newCachedThreadPool();
        for (int i = 0; i <= 10; i++) {
            //创建实现了Runnable接口对象
            MyThread myThread = new MyThread();
            //创建 Thread 类的实例,将实现类的实例作为参数传递给 Thread 的构造器
            Thread thread=new Thread(myThread);
            //将线程放入池中进行执行
            pool.execute(thread);
        }
        //关闭线程池
        pool.shutdown();
    }
}

运行结果:
pool-1-thread-1–>执行中。。。
pool-1-thread-5–>执行中。。。
pool-1-thread-4–>执行中。。。
pool-1-thread-3–>执行中。。。
pool-1-thread-2–>执行中。。。
pool-1-thread-7–>执行中。。。
pool-1-thread-6–>执行中。。。
pool-1-thread-8–>执行中。。。
pool-1-thread-2–>执行中。。。
pool-1-thread-6–>执行中。。。
pool-1-thread-8–>执行中。。。

(2) newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

public static void main(String[] args) {
        //创建一个可重用固定线程数的线程池
        ExecutorService pool = Executors.newFixedThreadPool(2);

        for (int i = 0; i <=10 ; i++) {
            MyThread myThread = new MyThread();
            Thread thread = new Thread(myThread);
            pool.execute(thread);
        }

        pool.shutdown();

    }

运行结果:
pool-1-thread-1–>执行中。。。
pool-1-thread-2–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-2–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-2–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-2–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-2–>执行中。。。

(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

public class TestScheduledThreadPool {

    public static void main(String[] args) {

        ScheduledExecutorService schedulePool = Executors.newScheduledThreadPool(2);
        // 5秒后执行任务
        schedulePool.schedule(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName()+"-->"+new Date());
            }
        }, 5, TimeUnit.SECONDS);
        // 5秒后执行任务,以后每2秒执行一次
        schedulePool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"-->"+new Date());
            }
        }, 5, 2, TimeUnit.SECONDS);
    }

}

注意:定时线程池中某个线程在循环执行的过程中如果发生异常没有处理,则该线程会结束定时。推荐@Scheduled注解

(4) newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

public static void main(String[] args) {
        ExecutorService pool = Executors.newSingleThreadExecutor();

        for (int i = 0; i <=10 ; i++) {
            MyThread myThread = new MyThread();
            Thread thread = new Thread(myThread);
            pool.execute(thread);
        }

        pool.shutdown();
    }

运行结果:
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。
pool-1-thread-1–>执行中。。。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值