黑马程序员---------Java基础知识:多线程
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:线程的概念
进程是一个正在执行的程序。每一个进程都有一个执行顺序,该顺序叫一个执行路径,或者叫一个控制单元。而线程就是进程中一个独立的控制单元,也就是说线程在控制着进程的执行,一个进程当中起码有一个线程。换句话说一个程序当中起码有一个线程,在需要的时候可以启动多线程。而main函数中的线程称为主线程。
二:线程的创建
创建线程有两种,一种是继承Thread,二是实现Runable接口。
1. 继承Thread,复写Thread类中的run方法。Run方法中的代码是让多线程执行的代码。启动线程时调用start方法。这个方法启动了线程,然后调用run方法方法。关闭线程则是stop方法。
例程显示的是第一种方法创建线程并启动线程。
public class Thread1Demo {
public static void main(String[] args) {
Test0 t1 =new Test0("01");//创建线程1
Test0 t2 =new Test0("02");
Test0 t3 =new Test0("03");
t1.start();//启动线程
t2.start();
t3.start();
}
}
class Test0 extends Thread
{
private int num= 10;//多线程公有数据
Test0(String name)
{
super(name);
}
public void run()//复写run方法
{
while(num>0)
{
num--;
Stringstr =num+"";
//Thread.currentThread() ;获取当前线程
this.setName(str);//设置线程名字
//this.getName();//获取当前线程名字
System.out.println(this.getName()+"线程..."+num);
}
}
}
2.实现Runable接口,首先定义实现Runable接口,然后覆盖接口中run方法,同样的把需要运行的代码放入方法中。在主函数中通过Thread类创建线程对象,将Runable子类对象作为实际参数传给Thread的构造函数。启动线程时调用start方法。这个方法启动了线程,然后调用run方法方法。关闭线程则是stop方法。使用这种方法的好处在于这个方法可以多实现,避免了单继承是局限性。
例程演示第二种多线程的创建方式。
public class Thread1Demo {
public static void main(String[] args) {
Test00 t =new Test00();//创建Runable子类
//将Runable子类对象作为实际参数传给Thread的构造函数
Thread t4 =new Thread(t);
Thread t5 =new Thread(t);
Thread t6 =new Thread(t);
t4.start();//启动线程
t5.start();
t6.start();
}
}
class Test00 implements Runnable
{
private int num =10;
Objectobj =new Object();
public void run()
{
while(true)//这个地方一定要用while,否则只会运行一次
{
synchronized(obj )//因为在多线程中共享数据会问题,所以要同步代码
{//但是这样的用法还有个问题就是比较耗费资源。
if(num>0)
{
//获取当前线程的名字,并打印出来 System.out.println(Thread.currentThread().getName()+" ..."+num--);
}
else
{
return;//跳出,假如没有这句的话,程序没有自动停止
}
}
}
}
}
总结:多线程创建其实不难,在实际编程当中,使用比较多的是第二中方式,而在很多题目当中说到某些数据是共享的,多个线程都操作那个共享数据,这样的话,需要在RUN方法之前就定义好被共享的数据,假如在RUN之内定义则是没有线程都有这样一个数据,而不是共享的。