Java#35(多线程扩展)

目录

一.定时器

定时器是一种控制任务延时调用, 或者周期调用的技术

1.Timer定时器(不推荐)

2.ScheduledExecutorService定时器(推荐)

二.并发与并行

三.线程状态


一.定时器

定时器是一种控制任务延时调用, 或者周期调用的技术

1.Timer定时器(不推荐)

代码示范: 

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerDemo1 {
    public static void main(String[] args) {
        Timer time1 = new Timer();//定时器本身就是一个多线程
        //schedule(TimerTask task,//任务
        //         long delay,//延时时间
        //         long period)//周期时间
        time1.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"输出了..."+new Date());
            }
        },2000,3000);
        Timer time2 = new Timer();//定时器本身就是一个多线程
        time2.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"输出了:::"+new Date());
            }
        },2000,3000);
    }
}

结果展示: 

Timer定时器的特点和存在的问题
(1) Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入

(2) 可能因为其中的某个任务的异常使Timer线程死掉,从而影响后续任务执行

2.ScheduledExecutorService定时器(推荐)

ScheduledExecutorService定时器的内部是线程池

代码示范: 

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Test1 {
    public static void main(String[] args) {
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);
        //scheduleAtFixedRate(Runnable command,//任务
        //                    long initialDelay,//延时时间
        //                    long period,//周期时间
        //                    TimeUnit unit)//延时时间和周期时间的单位
        pool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "输出了???"+new Date());
            }
        }, 3, 2, TimeUnit.SECONDS);
        pool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "输出了!!!"+new Date());
            }
        }, 3, 2, TimeUnit.SECONDS);

    }
}

结果展示: 

 优点: 基于线程池, 摸个任务的执行情况不会运行其他定时任务的执行

二.并发与并行

并发与并行
正在运行的程序(软件)就是一个独立的进程,线程是属于进程的,多个线程其实是并发与并行同时进行的
并发的理解:
CPU同时处理线程的数量有限
CPU会轮询为系统的每个线程服务,由于CPU切换的速度很快,给我们的感觉这些线程在同时执行,这就是并发

并行的理解:

同一时刻同时在进行

三.线程状态

1.NEW(新建)                    线程刚被创建,但是并未启动
2.Runnable(可运行)          线程已经调用了start()等待CPU调度
3.Blocked(锁阻塞)          线程在执行的时候未竞争到锁对象,则该线程进入Blocked状态
4.Waiting(无限等待)        一个线程进入Waiting状态,另一个线程调用notify或者notifyAll方法才能够唤醒
5.Timed Waiting(计时等待)     同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态, 带有超时参数的常用方法有Thread.sleep 、object.wait
6.Teminated(被终止)     因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡 

注意:调用sleep()方法不会让出锁对象, 但是调用wait()方法会让出锁对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值