回顾

在上一篇 Java 基础之线程那些事 我们介绍了关于线程和进程的相关概念,还留下了个题目:即三个窗口同时卖 100 张票的问题,那么今天就来说说多线程编程的实现。

构建多线程主要有继承和实现两种方法

多线程创建

1. 继承 Thread 类

继承的方法即构建一个类继承于 Thread 类,并实现 run 方法,具体如下

class SubThread extends  Thread{
    @Override
    public void run() {
       //具体需要完成的业务代码
    }
}
SubThread subThread=new SubThread();//创建实例
subThread.start();//线程启动
复制代码
  • start 方法启动线程并执行对应的 run 方法
  • 需要将需要实现的业务代码放在 run 方法内

2. 实现 Runnable 接口

实现 java.lang.Runnable 接口

class SubThread implements Runnable{//创建一个实现Runnable接口的类
    @Override
    public void run() {//实现run方法
     //你的业务代码
    }
}
SubThread subThread1=new SubThread();//创建一个实例
Thread t1=new Thread(subThread1);//把实例当参数传递给Thread构造方法 //得到一个线程实例
t1.start();//调用线程实例的start方法
复制代码

几个重要的步骤

  • 1 构建一个类实现 Runnable 接口
  • 2 重写 run 方法 run 里写你的业务代码
  • 3 构建这个类实例并当参数传递到 Thread 类构造方法中得到线程实例
  • 4 线程实例调用 start 方法

3.Thred 类的一些基础方法

Thread.currentThread() //获取当前线程
//以下都是线程实例上的方法
setName(); //设置线程名字
getName(); //获取线程名字
yield();//显示释放cpu的执行权  
join();//在一个线程执行中调用另一个目标线程的join方法,意味着立马执行目标线程,且执行完毕才回到原线程
isAlive();//判断当前线程是否还存活
sleep();//显示的让线程睡眠
setPriority() //设置当前线程的优先级
getPriority()//获取当前线程的优先级
复制代码

4. 对比继承与实现

都与 Runnable 接口相关

业务目标代码放在 run 方法里

鉴于 java 单继的特性 实现接口都方式更具有通用性

如果多个线程操作同一份资源 更适合使用实现都方式

卖票程序

在上一篇中我们留个问题:就是三个窗口卖票,票一共有 100 张,我们来实现它

1. 继承的方法

class Window extends  Thread{//继承
    static int ticket=100;
    @Override
    public void run() {
        while (true){
            if(ticket>0){
                System.out.println(Thread.currentThread().getName()+"售票:票号为:"+ ticket--);
            }else{
                break;
            }
        }
    }
}
//创建三个线程实例
Window w1=new Window();
Window w2=new Window();
Window w3=new Window();
w1.setName("窗口 1");
w2.setName("窗口 2");
w3.setName("窗口 3");
w1.start();
w2.start();
w3.start();
复制代码

由于是一共卖 100 张票,故需要设 ticket 为 static ,三个线程共享这个数据

2. 实现的方法

class Window implements Runnable{//实现接口
    int ticket=100;
    @Override
    public void run() {
        while (true){
            if(ticket>0){
                System.out.println(Thread.currentThread().getName()+"售票:票号为:"+ ticket--);
            }else{
                break;
            }
        }
    }
}

// 构建三个线程实例
Window w=new Window();
Thread t1=new Thread(w);
Thread t2=new Thread(w);
Thread t3=new Thread(w);
t1.setName(“窗口 1”);
t2.setName(“窗口 2”);
t3.setName(“窗口 3”);
t1.start();
t2.start();
t3.start();

复制代码

注:由于这里只有一个 Window 实例 所有只有一份 ticket=100,不需要 static 修饰

多线程程序的优缺点

在单核的时代,多线程会带来线程切换的损耗,但是即使是这样多线程对图形化界面更有意义,它可增强用户体验。(例如你在单核机器上边写代码 边听歌) 实际上多个线程在 cpu 上来回切换,给你一种并行的假象。

在多核心时代,例如当前的 8 代 i7 处理器,已经是 6 核 12 线程了,可以保持多个线程并行运算,极大的提高性能,用多线程编程 反而能提高计算机 cpu 的利用率

另外多线程编程能改善程序结构,可将长又复杂的进程分割成多个线程,独立运行,利于理解和修改

总结

今天主要讲解如何实现多线程,以及线程实例上有哪些方法,需要重点掌握实现的方式,因为实现的方式避开了 java 单继承的缺点。

但是本文的样例代码并不是线程安全的, 关于线程安全问题,我们下一篇讲解。

喜欢本文的朋友们,欢迎长按下图关注订阅号 "我的编程笔记",收看更多精彩内容~~

  • Java

    Java,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台的总称。用 Java 实现的 HotJava 浏览器(支持 Java applet)显示了 Java 的魅力:跨平台、动态的…

    380 引用 • 6 回帖
感谢    赞同    分享    收藏    关注    反对    举报    ...