----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
多线程:进程是计算机上正在执行的一个程序,每个程序都有一个执行顺序,该顺序是一个执行路径或叫控制单元,而线程就是这个独立的控制单元
①一个进程至少有一个线程在执行
②线程控制着进程的执行
③java.exe中至少有一个线程在控制着进程的执行,而这个线程存在于main方法中,被称为主线程
④在单核时代,线程执行具有一个特点,即随机性
线程的运行状态:
线程创建的两种方法:
第一种:继承Thread类,并重写Thread中的run()方法
class Demo extends Thread{
//重写原因:只有Thread类中的run()方法是用来封装线程要执行的代码的
public void run(){
线程要执行的语句;
}
public static void main(String[] args){
Demo d=new Demo();
d.start();//这是Thread类中的方法,作用是开始执行线程并同时调用run()方法。若写成d.run(),只是在调用本子类中的run()方法,而线程被创建了却没执行
}
}
①线程数=主线程+new的几个线程对象
②每个线程都有默认名称,即从0开始编号(Thread-0).事实上,在我们初始化线程对象时,其已经被父类中的构造方法赋予了名称,我们只需在子类的构造方法中用super(name)来调用即可
getName():获取当前正在执行的线程名称,可用this.调用,但这种方式并不通用于线程创建方法,而Thread.currentThread().getName()静态方法是通用的,一般用它
③局部变量在每个线程中都具有独立的一份
第二种:实现Runnable接口,重写其中run()方法
class Ticket implements Runnable{
private int tickets=100;
public void run(){
while(true){
if(tickets>0)
System.out.println(Thread.currentThread().getName()+" sales "+tickets--);
}
}
public static void main(String[] args){
Ticket t=new Ticket();
Thread t1=new Thread(t);//想调用Ticket中的run()方法,但它重写的不是Thread类中的run()方法,而是Runnable接口中的,那我们就调用Thread类中的构造方法
Thread t2=new Thread(t);//Thread(Runnable r)来明确我们想用来调用run()方法的对象
t1.start();//不能一个线程start四次
t2.start();
}
}
两种创建线程方法的优劣:
第一种:不能使子类再继承其它父类,重写其中方法
第二种:避免了单继承的局限性,所以推荐使用第二种方法
To be continue...
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------