Java复习打卡day19

线程和进程

线程和进程
一些喜欢变成的小伙伴都喜欢有事没事的打开自己电脑的任务管理器,看看电脑正在执行的进程和线程数量
现在Windows10 的话,要打开自己的资源监视器才能看到线程的数目。
在这里我就要给大家讲一讲线程和进程的关系:
进程:其实电脑上的进程就是那个上面的一个个应用程序,刚刚兴起电脑的时候一个应用程序可能只有一个进程,但是到现在一个应用可以用多个进程了;
线程:java中讲到线程的几率会比讲到进程的几率大很多,但事实是一个线程只是进程的一个中多线程之一。就是线程是包含在进程里面的。

----------------------------------------------
线程的调度
线程的调度分为两种:
分时调度:各个线程轮流使用CPU;
抢占式调度:CPU高速运转在各个线程之中,谁抢到了,谁就执行。
其实多线程并不能提高程序的执行速度,但是却能提高使用效率,是CPU 的使用率提高

同步与异步&并发与并行

同步和异步
同步:排队执行,效率低但是安全;
异步:同时执行,效率高但是不安全。
----------------------------------------------
并发和并行
并发:多线程在同一时段内同时执行;
并行:多线程在同一时刻同时执行。

Thread类的继承

public class Demo {
    public static void main(String[] args) {
        //在说Thread类之前,先讲一下Thread类的继承
        MyThread mt = new MyThread();
        mt.start();
        for (int i = 0; i < 5; i++) {
            System.out.println("床前明月光,疑是地上霜" + i);
        }
    }
}
class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("锄禾日当午,汗滴禾下土" + i);
        }
    }
}

Runnable接口和Thread类的一些方法

public class Demo1 {
    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        Thread t = new Thread(mr);//调用
        t.start();
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + i);
            //这里用到了两个方法前一个是返回当前的线程对象,后一个是返回当前的对象的名字
            //有名字就返回名字,没有的话,直接返回默认名字:
            //main线程或者是Thread线程
            System.out.println("床前明月光,疑是地上霜" + i);
        }
        t.interrupt();
        //这个方法是Thread方法自带的,它向catch块传递一个中断信号,由catch来判断是否中断
        //这个中断线程的方法也是在stop被启用之后非常热门的中断线程的方法
    }
}
class MyRunnable implements Runnable{
    //Runnable 接口的实现邮储其实和继承Thread类有异曲同工之处
    //后者比前者就少了一步调用,而在今后的学习中我们主要使用前者

    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see Thread#run()
     */
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("接受到了中断标记,我要中断了!");
                return;//将程序终止
            }
            System.out.println("床前明月光,疑是地上霜" + i);
        }
    }
}

线程的常见用法和问题

设置获取线程的名称

public class Demo2 {
    public static void main(String[] args) {
        Thread.currentThread().setName("第一-线程");
        System.out.println("我的名字是:" + Thread.currentThread().getName());
        MyThread1 mt = new MyThread1();
        mt.setName("最强-线程");
        mt.start();
    }
}
class MyThread1 extends Thread{
    @Override
    public void run() {
        System.out.println("我的名字是:" + Thread.currentThread().getName());
    }
}

线程的阻塞

线程阻塞
在讲线程阻塞之前先讲一个日常例子
某地铁口,因为各种原因只修了一个电梯,所以每到人们出站的时候都会发生拥堵情况,人太多了,都要通过这一个电梯出去。这就是堵塞;
其实,线程的阻塞也是这个道理,
大量的线程需要执行,但是电脑只有几个CPU,不够用,导致了阻塞。

线程的守护Daemon

public class Demo3 {
    public static void main(String[] args) {
        //Daemon守护
        //所有的线程在没有特殊说明的情况下都是用户线程,而守护线程则是守护用户线程的
        //一旦用户线程执行完毕,守护线程就必须立马终止

        MyThread mt = new MyThread();
        mt.setDaemon(true);
        System.out.println(mt.isDaemon());
        mt.start();
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName());
            System.out.println("床前明月光,疑是地上霜" + i);
        }
    }
    static class MyThread extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName());
                System.out.println("锄禾日当午,汗滴禾下土" + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("我的使命完成了");
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java员工打卡签到代码的实现方式有很多种,以下是其中一种可能的实现方式: ```java import java.util.Date; public class Employee { private String name; private Date lastSignIn; public Employee(String name) { this.name = name; } public void signIn() { Date now = new Date(); System.out.println(name + "签到成功,时间:" + now); lastSignIn = now; } public void signOut() { Date now = new Date(); System.out.println(name + "签退成功,时间:" + now); } public void checkInStatus() { if (lastSignIn == null) { System.out.println(name + "尚未签到"); } else { System.out.println(name + "上次签到时间:" + lastSignIn); } } } ``` 上面的代码定义了一个`Employee`类,其中包含了员工的姓名和上次签到时间。类中有三个方法:`signIn()`、`signOut()`和`checkInStatus()`。`signIn()`方法表示员工签到,会打印出员工姓名和当前时间,并将当前时间记录为上次签到时间;`signOut()`方法表示员工签退,会打印出员工姓名和当前时间;`checkInStatus()`方法表示查询员工的签到状态,会打印出员工姓名和上次签到时间(如果已经签到过),否则会提示尚未签到。 如果要使用这段代码,可以在其他类中创建`Employee`对象,并调用其中的方法来完成打卡签到功能。例如: ```java public class Main { public static void main(String[] args) { Employee emp1 = new Employee("张三"); emp1.signIn(); emp1.checkInStatus(); emp1.signOut(); } } ``` 这段代码创建了一个名为`emp1`的`Employee`对象,姓名为“张三”。接着调用了`signIn()`方法进行签到,`checkInStatus()`方法查询签到状态,最后调用了`signOut()`方法进行签退。运行这段代码后,会打印出以下结果: ``` 张三签到成功,时间:Thu Jul 22 14:47:23 CST 2021 张三上次签到时间:Thu Jul 22 14:47:23 CST 2021 张三签退成功,时间:Thu Jul 22 14:47:28 CST 2021 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值