Java学习第二十二天

Java学习第二十二天知识点(线程)

程序:是一个指令和数据的有序集合.

进程:在运行中的程序 -进程是资源分配的最小单位

线程:在进程中[多个同时在执行]的任务 - 线程是cpu的最小调度单位

并行: 指两个或多个事件在同一时刻发生(同时发生)
并发: 指两个或多个事件在同一时间段内发生

线程类:Thread
1.线程的概念
1).进程中多个同时执行的任务
2).主方法程序运行就是打开一个进程,进程中至少存在一个线程 - 主线程 main

2.自定义线程的方式
1)自定义线程类 - 继承 Thread

  a.自定义线程类,继承Thread
  b.重写run()
  c.创建线程对象
  d.start()开启线程
  结论: 一个类只能有一个父类,当他继承Thread,这个类就只能是线程类了,有局限性

2).自定义任务类 - 实现Runnable接口

  a.自定义类任务类,实现Runnable接口
  b.重写run()
  c.创建任务类对象
  d.通过任务类对象,构造线程对象
  e.start()开启线程
  结论: 
  	a.类除了可以实现Runnable接口,还可以继承其他类,和实现其他接口,没有太多的局限性
  	b.在创建相同的任务线程时,任务对象可以重复使用

3).匿名内部类创建线程类 - 结合(1)或(2)
	注意: 这不是一种创建方式,只是一种优化写法

线程创建测试运行代码:

public class ThreadDemo01 {
    public static void main(String[] args) {
        //线程可以多创建
        MyThread myThread = new MyThread();
        myThread.start();

        //添加线程名字
        MyThread myThread0 = new MyThread("老线程!");
        myThread0.start();
        MyThread myThread1 = new MyThread("新线程!");
        myThread1.start();
        //通过匿名内部类的方法写
        Thread myThread2= new Thread("匿名"){
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(getName()+i);
                }
            }
        };
        myThread2.start();

        /*任务类*/
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable,"run!");
        thread.start();

        //嵌套写法
        Thread thread1 = new Thread(new MyRunnable(), "nmRun!");
        thread1.start();
        //常用写法
        Runnable myRunnable1 = new Runnable(){
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+"匿名Run"+i);
                }
            }
        };
        Thread threadNM = new Thread(myRunnable1,"匿名run!");
        threadNM.start();
        //匿名完全嵌套写法
        Thread thread2 = new Thread(new Runnable(){
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+"匿名Run1"+i);
                }
            }
        }, "nmRunNM!");
        thread2.start();

        //System.out.println(thread2.isDaemon());

        //主线程
        for (int i = 0; i < 10; i++) {
            System.out.println("主要线程"+i);
        }


    }
}

自定义线程:

public class MyThread extends Thread{
    public MyThread() {
    }

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            //Thread.currentThread().getName()
            System.out.println(getName()+"正在执行"+i);
        }
    }
}

自定义任务类:

public class MyRunnable implements Runnable{
    public MyRunnable() {
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"runnable"+i);
        }
    }
}

3.Thread常用API:
1).currentThread() -> 获取当前线程对象
2).getName() ->获取当前线程对象的名字
3).getPriority() -> 获得线程优先级

   setPriority -> 设置线程优先级
   	注意: 
   	  范围: 1 ~ 10 
   	  	数越大,优先级越高(优先级只是改变cpu分配时间片的概率)

4).isDeamon() -> 询问是不是守护线程

	注意:
	  守护线程 / 前台线程
	  当所有的前台线程都结束之后,守护线程也会自动结束
	  java中自带的守护线程 - GC

守护线程测试代码:

public class priorityDemo {
    public static void main(String[] args) {

        Runnable myRunnable1 = new Runnable(){
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try{
                        Thread.sleep(10);
                        System.out.println(Thread.currentThread().getName()+":"+i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
                System.out.println("一完了");
            }
        };


        Runnable myRunnable = new Runnable(){
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    try{
                        //结束进程需要时间所以设置sleep,给予反应时间
                        Thread.sleep(10);
                        System.out.println(Thread.currentThread().getName()+":"+i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //System.out.println(Thread.currentThread().getName()+":"+i);
                }
                System.out.println("二完了");
            }
        };


        Thread thread1 = new Thread(myRunnable,"二");
        //thread1.setDaemon(true);
        thread1.start();

        Thread thread = new Thread(myRunnable1,"一");
        thread.setDaemon(true);
        thread.start();

    }
}

5).Thread.sleep() -> 线程休眠指定时间

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值