课堂笔记--多线程

 

程序、进程、线程

程序:计算机指令的集合,它以文件的形式存储在磁盘上。其本身没有任何运行的含义,是一个静态的概念 .

进程:程序的一次动态执行过程,它对应从代码加载、执行到执行完毕的一个完整过程。

进程也称任务,支持多个进程同时执行的OS就被称为多进程OS或多任务OS。

是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;当你运行一个程序,你就启动了一个进程。程序是死的(静态的),进程是活的(动态的)。

多进程:在操作系统中能同时运行多个程序。

线程:在一个程序内部也可以实现多个任务并发执行,其中每个任务称为线程。

线程是比进程更小的执行单位,它是在一个进程中独立的控制流,即程序内部的控制流。

特点:线程不能独立运行,必须依赖于进程,在进程中运行。

每个程序至少有一个线程称为主线程。

单线程:只有一条线程的进程称为单线程

多线程:有不止一个线程的进程称为多线程(在同一个程序中有多个线程同时执行)

进程线程:一个进程可以拥有多个线程。它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信较进程简单。

开启多线程的优点和缺点:

1、提高界面程序响应速度。通过使用线程,可以将需要大量时间完成的流程在后台启动单独的线程完成,提高前台界面的相应速度。

2、充分利用系统资源,提高效率。通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的性能。

3、当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。但是,相对于优势来说,劣势还是很有限的,所以现在的项目开发中,多线程编程技术得到了广泛的应用。

 

多线程的实现

在实现线程编程时,首先需要让一个类具备多线程的能力,继承Thread类或实现Runnable接口的类具备多线程的能力,然后创建线程对象,调用对应的启动线程方法即可实现线程编程。

    在一个程序中可以实现多个线程,多线程编程指在同一个程序中启动了两个或两个以上的线程。

    在实际实现线程时,Java语言提供了三种实现方式:

继承Thread类

实现Runnable接口

使用Timer和TimerTask组合

一、继承Thread线程类实现多线程
java.lang包中提供了一个专门的线程类(Thread),在该类中封装了许多对线程进行调度和处理的方法。如果一个类继承了Thread类,则该类就具备了多线程的能力,可以多线程的方式执行。

   class   MyThread  extends Thread{

        public void run(){

                //线程体

         }

   }

线程的特性:随机性,系统在执行多线程程序时只保证线程是交替执行的,至于哪个线程先执行哪个线程后执行,则无法获得保证,需要书写专门的代码才可以保证执行的顺序。

     当自定义线程中的run方法执行完成以后,则自定义线程自然死亡。而对于系统线程来说,只有当main方法执行结束,而且启动的其它线程都结束以后,才会结束。当系统线程执行结束以后,程序的执行才真正结束。

程序代码例子:

package Thread;

 

public class ff extends Thread{

 

    /**

     * @param args

     * @throws InterruptedException

     */

    public ff(String str){

       super(str);

    }

    public static void main(String[] args){

       // TODO Auto-generated method stub

       DemoThread1 dt=new DemoThread1("线程");//线程新建状态

       dt.start();//start()--启动线程---线程就绪状态  dt在就绪队列中等待

       for(int i=0;i<10;i++){

           System.out.println("main:"+i);

           try {

              Thread.sleep(50);

           } catch (InterruptedException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

       System.out.println("main结束");

    }

    //线程完成什么样的任务,完成任务代码放在run()方法

    public void run(){

       for(int i=0;i<10;i++){

           System.out.println(this.getName()+":"+i);

       }

       System.out.println(this.getName()+"结束");

    }

}

 

对于同一个线程类,也可以启动多个线程。
Thread2 t2 = new Thread2();   t2.start();
Thread2 t3 = new Thread2();   t3.start();

同一个线程不能启动两次,例如 
Thread2 t2 = new Thread2();
t2.start();          t2.start();   //错误

二、实现Runable接口

多线程对象实现java.lang.Runnable接口并且在该类中重写Runnable接口的run方法。

好处:实现Runable接口的方法避免了单继承的局限性。

运用接口编写程序实现数字时钟:

 /*

 * ClockFrame.java

 *

 * Created on __DATE__, __TIME__

 */

package Thread;

import java.util.Date;

/**

 *

 * @author  __USER__

 */

public class ClockFrame extends javax.swing.JFrame implements Runnable {

    /** Creates new form ClockFrame */

    public ClockFrame() {

       initComponents();

    }

    /** This method is called from within the constructor to

     * initialize the form.

     * WARNING: Do NOT modify this code. The content of this method is

     * always regenerated by the Form Editor.

     *///GEN-BEGIN:initComponents

// <editor-fold defaultstate="collapsed" desc="Generated Code">

    private void initComponents() {

       display = new javax.swing.JLabel();

       setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

       display.setFont(new java.awt.Font("宋体", 1, 24));

       display.setText("\u73b0\u5728\u7684\u65f6\u95f4\u662f\uff1a");

       javax.swing.GroupLayout layout = new javax.swing.GroupLayout(

              getContentPane());

       getContentPane().setLayout(layout);

       layout.setHorizontalGroup(layout.createParallelGroup(

              javax.swing.GroupLayout.Alignment.LEADING).addGroup(

              layout.createSequentialGroup().addGap(32, 32, 32).addComponent(

                     display, javax.swing.GroupLayout.PREFERRED_SIZE, 412,

                     javax.swing.GroupLayout.PREFERRED_SIZE)

                     .addContainerGap(23, Short.MAX_VALUE)));

       layout.setVerticalGroup(layout.createParallelGroup(

              javax.swing.GroupLayout.Alignment.LEADING).addGroup(

              layout.createSequentialGroup().addGap(27, 27, 27).addComponent(

                     display, javax.swing.GroupLayout.PREFERRED_SIZE, 68,

                     javax.swing.GroupLayout.PREFERRED_SIZE)

                     .addContainerGap(37, Short.MAX_VALUE)));

       pack();

    }// </editor-fold>

    //GEN-END:initComponents

    /**

     * @param args the command line arguments

     */

    public static void main(String args[]) {

       ClockFrame cf = new ClockFrame();

       Thread t = new Thread(cf);

       //cf.setSize(100, 50);

       cf.setVisible(true);

       t.start();

    }

    //GEN-BEGIN:variables

    // Variables declaration - do not modify

    private javax.swing.JLabel display;

 

    // End of variables declaration//GEN-END:variables

    @Override

    public void run() {

       // TODO Auto-generated method stub

       while (true) {

           Date d = new Date();

           display.setText(d.toString());

           try {

              Thread.sleep(1000);

           } catch (InterruptedException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

    }

}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值