黑马程序员—java异常

来源:互联网 发布:mac桌面东西没了 编辑:程序博客网 时间:2024/06/05 20:35

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

1.线程 与 进程


     进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程。
线程是指进程中的一个执行任务(控制单元),一个进程中可以运行多个线程,多个线程可共享数据。     
一个进程中至少有一个线程

  java VM 启动的时候会有一个进程 java.exe
该进程中至少一个线程负责java程序的执行。而且这个线程运行代码存在于main方法中,该线程称之为主线程
扩展:其实更细节说明jvm  jvm启动不止一个线程,还有负责垃圾回收机制的线程。

2.线程的创建

1)创建线程的第一种方式:

继承Thread类。


  步骤:


  1.定义类继承Thread


  2.复写Thread类中的run方法


  目的:将自定义代码存储在run方法。让线程运行


  3.调用线程的start 方法


  该方法两个作用:启动线程 调用run方法


class Demo extends Thread  
{  
    public void run()  
    {  
        for (int i = 0; i < 60; i++) {  
              
            System.out.println("demo run---- "+i);  
        }  
    }  
}  
public class ThreadDemo {  
    public static void main(String[] args) {  
//      for (int i = 0; i < 400; i++) {  
//          System.out.println("Hello World");  
//      }  
          
        Demo d = new Demo();  //创建好一个线程  
        d.start();  //开启线程 并执行run方法  
        //d.run();  //只是调用对象的方法,创建线程没有运行  
          
        for(int i = 0; i<60 ; i++)  
            System.out.println("Hello World!----"+i);  
    }  
}  


发现运行结果每一次都不同。
因为多个线程都获取cpu的执行权。 cpu执行到谁,谁就执行
明确一点,在某一个时刻,只能有一个程序在运行。
cpu在做着快速的切换,以达到看上去是同时运行的效果

多线程的一个特性:随机性
为什么要覆盖run方法呢?
Thread类用于描述线程。
该类就定义一个功能,用于存储线程要运行的代码,该存储功能就是run方法
也就是说Thread类中的run方法,用于存储线程要运行的代码


练习:

package day11;  
/* 
 * 练习: 
 * 创建两个线程,和主线程交替运行 
 *  
 * 原来线程都有自己默认的名字 
 * Thread-编号  该编号从0开始 
 *  
 *  
 * static Thread currentThread(): 获取当前线程对象 
 * getName():获取线程的名称 
 *  
 * 设置线程名称:setName或者构造函数。 
 */  
  
class Test extends Thread  
{  
    //private String name;  
    public Test(String name){  
        //this.name = name;  
        super(name);  
    }  
    public void run() {  
        for (int i = 0; i < 60; i++) {  
            System.out.println(Thread.currentThread().getName()+" run..."+i);  
        }  
    }  
}  
public class ThreadTest {  
    public static void main(String[] args) {  
        Test t1 = new Test("test1");  
        Test t2 = new Test("test2");  
        t1.start();  
        t2.start();  
          
        for (int i = 0; i < 60; i++) {  
            System.out.println("main....."+i);  
        }  
    }  
}  


2)创建线程的第二种方式:

实现Runnable接口

步骤:


1.定义类实现Runnable接口


2.覆盖Runnable接口中的run方法  


将线程要运行的代码存放在改run方法中


3.通过Thread类建立线程对象


4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造方法


5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法

package day11;  
/* 
 * 需求: 简单的买票程序 
 * 多个窗口同时卖票 
 *  
  
 */  
  
class Ticket implements Runnable //extends Thread  
{  
    private static int tick = 100;  
    public void run(){  
        System.out.println(Thread.currentThread().getName()+"sale: "+tick--);  
    }  
}  
public class TicketDemo {  
    public static void main(String[] args) {  
          
        Ticket t = new Ticket();  
          
        Thread t1 = new Thread(t);//创建一个线程  
        Thread t2 = new Thread(t);//创建一个线程  
        Thread t3 = new Thread(t);//创建一个线程  
        Thread t4 = new Thread(t);//创建一个线程  
          
        t1.start();  
        t2.start();  
        t3.start();  
        t4.start();  
    /*  Ticket t1 = new Ticket(); 
//      Ticket t2 = new Ticket(); 
//      Ticket t3 = new Ticket(); 
//      Ticket t4 = new Ticket(); 
         
        t1.start(); 
        t1.start(); 
        t1.start(); 
        t1.start();*/  
          
    }  
      
}  


为什么要将Runnable接口的子类对象传递给Thread的构造方法。
因为,自定义的run方法所属的对象是Runnable接口的子类对象。
所以要让线程去指定对象的run方法。就必须明确该run方法所属对象

实现方式和继承方式有什么区别?
实现方式好处:避免了单继承的局限性。
实现Runnable,线程代码存在接口的子类的run方法。

两种方式区别
继承Thread:线程代码存放Thread子类run方法中。

实现Runnable,线程代码存在接口的子类的run方法。

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------ 

详细请查看www.itheima.com



0 0
原创粉丝点击