程序,线程,线程

1. 程序:为完成特定任务而编写的一段指令的集合

2. 进程:是程序的一次执行过程,或是正在运行的一个程序.是一个动态的过程:它有自身的产生,存在和消亡的过程-----生        命周期,

3. 线程:进程可以进一步细化为线程,是一个程序内部的一条执行路径,

        一个进程可以支持并行多个线程,此时称之为多线程的

3.1 多线程的优点:提高用户体验,提高计算机程序的CPU利用率,

3.2 多线程使用情况:需要同时执行两个或多个任务时

                         程序需要实现一些需要等待的任务时,如用户输入,文件读写,网络操作等

                          需要一些后台运行的程序时

如何创建多线程:

  1. 方式一,继承Thread类:创建一个继承与Thread类的子类,再使用start()去调用重写后的子类的run方法
  2. Threas中常用的方法:

            start():启动线程,

            sleep():让当前调用此方法的线程睡眠之低昂的毫秒数,

            run():创建的线程真正要执行的操作

   currentThread:获取执行当前代码所在的线程

   yield():主动释放CPU

   join():线程a中调用了线程b的join()方法,此时线程a阻塞,直到线程b执行完成,a线程继续执行

   isAlive():当前线程是否已经执行结束

   stop():停止线程


//创建一个类继承与Thread类
class EvenThread extends Thread{
    //重写run方法
    @Override
    public void run() {
       for (int i = 0; i < 100; i++) {
        if (i%2==0) {
            System.out.println(i);
        }
    }
  }
}
public class ThreadTest {

    public static void main(String[] args) {
        //创建子类对象
        EvenThread e=new EvenThread();
        //调用线程的start()启动,只能通过start启动,否则按顺序执行,不再进入线程子类
        e.start();
                //调用匿名对象创建的线程的启动
                t1.start();

                //使用匿名对象创建线程
          Thread t1=new Thread(){
          @Override public void run() { 
           for (int i = 0; i < 100; i++)
             { if (i%2==0) { 
            System.out.println(i); 
        } 
    }
  }
}            
}

 线程优先级的设置:

如何设置优先级:setPriority():------>例如e1.setPriority(MAX_PRIORITY),      MIN_ PRIORITY =1, NORM_ PRIORITY=5,   MAX_ PRIORITY =10

如何获取优先级:getPriority()

注意:高优先级的线程会抢占低优先级的线程,但是不意味着高优先级的一定先执行完成    

方式二:使用runable接口创建线程:创建runable的实现类,实现该接口,重写run方法

package threadtest;

public class Ruanble {
    
    public static void main(String[] args) {
        //创建实现类的对象
        Num num=new Num();
        //将此对象作为参数传递给Thread类的构造器,创建Thread类的对象
        Thread thread =new Thread(num);
        //调用start()启动创建的Thread对象
        thread.start();
        thread.setName("线程一");
        
    }
}
//创建一个类实现Runable接口
class Num implements Runnable{
    
    //重写run方法
    @Override
    public void run() {
        for (int i = 0; i <100; i++) {
            if (i%2==0) {
                System.out.println(Thread.currentThread().getName()+"de素数wei:"+i);
            }
        }
    }
}

比较实现Runable 和继承Thread的优劣:  对比后Runable要好于继承Thread

    原因:

  1. 实现方式,解决单继承的局限性
  2. 实现的方式针对于有共享数据的情况,操作起来跟方便
  3. 实现的凡是可以做到数据和代码的分离

方式三:使用callable创建多线程

    如何理解实现Callable接口的方式创建多线程比实现Runable接口创建线程方式强大

  1. Callable重写或实现的方法可以有返回值
  2. 重写或实现的方法可以抛出异常
  3. 使用Callable是可以使用泛型,并指明call()的返回值类型
  4. 与Runable扥不同是,他重写的是call()方法

方式四:使用线程池创建多线程(类似与数据库连接池)

提高响应速度(减少创建新线程的时间)

减低资源消耗(重复利用线程池中线程,不需要每次都创建)

便于线程管理:--------->>>>

  corePoolSize:核心池的大小

  maximumPoolSize:最大线程数

  keepAliveTime:线程没有任务是最多保持多长时间会终止

原文地址:https://www.cnblogs.com/ylblikestudyJava/p/12374904.html