黑马程序员——线程Thread一(线程创建)

来源:互联网 发布:相思相见知何日 编辑:程序博客网 时间:2024/04/30 23:31

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
线程在java语言中是很重要的东西,我们需要牢固掌握好,线程在后期的应用是非常多的。线程的应用提高了程序的并发性,几个线程可以同步完成一个目的,会提高效率。一个程序,如果单线程顺序执行,如果在某一环节出现缓慢的,后面的就会效率低。如果用多个线程同时去处理这个问题,出现问题的环节,对整个程序的影响将会降低。所以熟练掌握好线程十分重要。
一什么时线程?
在了解线程是什么之前,我们需要先了解什么进程。
进程就是一个正在执行中的程序,每一个进程都有一个执行顺序,或者叫一个控制单元。
线程就是进程中的那个独立的控制单元,线程控制着进程的执行。

创建线程的方法:
方法一
定义类继承Thread;
复写Thread类中的run方法;
调用线程的start方法

class Demo extends Thread{//继承Thread      private String name ;   Demo(String name){         this.name = name;         }     public void run(){//复写run方法         for(int x = 0; x < 10; x++){.  System.out.println(name + "...x=" + x + "...ThreadName=" +                    Thread.currentThread ().getName());             }         }     }       class ThreadDemo{     public static void main(String[] args){         Demo d1 = new Demo("我是线程1");//创建线程,并线程命明         Demo d2 = new Demo("我是线程2");         d1.start(); // 开启线程,调用 run 方法。         d2.start();         for(int x = 0; x < 20; x++){             System.out.println("x = " + x + "...over..." + Thread.currentThread().getName());         }            }       }

( run方法:用于存储线程中要运行的代码)
(start方法:的两个动作:启动线程和调用run方法)
run():仅仅是对象调用,而线程创建了没运行
start():开启线程并执行该线程中的run方法。

创建线程的第二种方式,实现Runable接口
1.定义类实现Runnable接口。
2.覆盖接口中的run方法,将线程的任务代码封装到run方法中。
3.通过Thread类创建线程对象
4.并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。(因为线程的任务都封装在Runnable接口子类对象的run方法中。所以要在线程对象创建时就必须明确要运行的任务。)
5.调用线程对象的start方法开启线程

// 准备扩展 Demo 类的功能,让其中的内容可以作为线程的任务执行。// 通过接口的形式完成。 class Demo implements Runnable{     public void run(){        show();        }    public void show(){        for(int x = 0; x < 20; x++){            System.out.println(Thread.currentThread().getName() + "..." + x);             }         }     }class ThreadDemo{    public static void main(String[] args){         Demo d = new Demo();         Thread t1 = new Thread(d);         Thread t2 = new Thread(d);        t1.start();        t2.start();       }      }

方法一和方法二的区别在于,方法二的实现方式,避免了方式一的单继承限制问题。此外实现Runable方法还有一个好处:,将线程的任务从线程的子类中分离出来,进行了单独的封装,按照面向对象的思想将任务封装成对象。
如果多线程有共享数据,建议使用Runable方法。
Thread类、Runnable接口内部源码关系模拟代码:

class Thread{     private Runnable r ;     Thread(){        }      Thread(Runnable r){         this.r = r;        }    public void run(){         if(r !=null)              r.run();         }     public void start(){          run();          }      }class ThreadImpl implements Runnable{    public void run(){        System.out.println("runnable run" );          }    }class ThreadDemo4{    public static void main(String[] args){        ThreadImpl i = new ThreadImpl();        Thread t = new Thread(i);        t.start();         }     }class SubThread extends Thread{    public void run(){        System.out.println("hahah" );        }    }class ThreadDemo5{    public static void main(String[] args){        SubThread s = new SubThread();        s.start();         }    }

四个售票员售卖100张票示例:

public class Ticketer extends Thread {    public static int ticket=100;    @Override    public void run() {        while (true) {            if (ticket > 0) {                System.out.println(currentThread().getName() + "---" + ticket--);            }            else                break;        }    }}public class TicketDemo {    public static void main(String[] args){        Ticker2 ticker2=new Ticker2();        Thread t1=new Thread(ticker);        Thread t2=new Thread(ticker);        Thread t3=new Thread(ticker);        Thread t4=new Thread(ticker);        t1.start();        t2.start();        t3.start();        t4.start();}}
0 0
原创粉丝点击