Java多线程在使用程序的时候,就像开了一个进程,进程中执行的操作就是线程。以迅雷为例,打开迅雷就相当于打开了一个进程。下载文件的操作是一个线程,多线程就是同时下载多个文件。在Java中有两种实现多线程的方法。它们继承了Thread类并实现了Runnable接口。继承Thread类Thread类中有一个run方法,但是这个run方法需要重写,所以我们需要自定义一个类来继承Thread类,然后在自定义类中重写run方法。改写之后,我们可以创建一个对象,使用这个对象来调用这个方法,但是因为这个是多线程的,如果直接调用run方法,是无法实现多线程的,然后有一个新的方法start方法为我们要使用,这个方法会自动调用run方法。代码:packagecom.abbott;classMusicThreadextendsThread{publicvoidrun(){for(intx=0;x<10;x++){System.out.println(getName()+":"+x);}}}publicclassMultiplyThread{publicstaticvoidmain(String[]args){//创建一个多线程对象MusicThreadmt1=newMusicThread();MusicThreadmt2=newMusicThread();MusicThreadmt3=newMusicThread();//设置每个对象的名称mt1.setName("abbott");mt2.setName("刘");mt3.setName("java");//调用start()方法,内部调用run()方法实现多线程//如果直接调用run()方法,不能实现多线程mt1.start();mt2.开始();mt3.开始();}}二、实现Runnable接口,解决单继承的局限性,因为如果某个类已经有了父类,那么它就不能再继承Thread来实现多线程了,于是就有了实现接口的多线程。我们使用的大部分方法也是使用接口来实现多线程。接口方式实现多线程,我们需要自定义一个类来实现Runnable接口,然后重写自定义类中的run方法,然后创建自定义类的对象,最后创建Thread类的对象,并将创建的自定义对象作为参数传递。packagecom.abbott;classFather{privateStringname="刘建";publicStringgetName(){返回名称;}}classMusicThreadextendsFatherimplementsRunnable{staticintcount=0;//公共资源privateintt=0;privatesynchronizedvoidincrease(){count++;}@Overridepublicvoidrun(){for(intx=0;x<100;x++){increase();System.out.println(Thread.currentThread().getName()+":"+count);//System.out.println(Thread.currentThread().getName()+":"+t++);}}}publicclassMultiplyThread{publicstaticvoidmain(String[]args)throwsInterruptedException{//创建多线程对像MusicThreadmt=newMusicThread();Threadt1=newThread(mt,"雅培");Threadt2=newThread(mt,"liu");Threadt3=newThread(mt,"你好");//设置每个对象的名称t1.start();t2.开始();t3.开始();}}三、继承Thread类和实现Runnable方法的区别。继承Thread类不适合资源共享,但是实现Runnable接口很容易实现资源共享。实现Runnable接口适合多个同一个程序代码的线程处理同一个资源,避免了Java中的单继承限制,增强了程序的健壮性,代码可以被多个线程共享4.线程延迟休眠()包com.abbott;classFather{privateStringname="刘健";publicStringgetName(){返回名称;}}classMusicThreadextendsFatherimplementsRunnable{staticintcount=0;//公共资源privateint=0;privatesynchronizedvoidincrease(){count++;}@Overridepublicvoidrun(){for(intx=0;x<100;x++){increase();尝试{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+":"+count);//System.out.println(Thread.currentThread().getName()+":"+t++);}}}公共类MultiplyThread{publicstaticvoidmain(String[]args)throwsInterruptedException{//创建一个多线程对象MusicThreadmt=newMusicThread();Threadt1=newThread(mt,"雅培");t1.开始();}}5、线程中断interrupt()packagecom.abbott;classMusicThreadextendsThread{publicvoidrun(){System.out.println("threadstart");try{//这里是线程休息2秒,如果线程在2秒内被中断,执行catchThread.sleep(2000);}catch(InterruptedExceptione){//e.printStackTrace();System.out.println("线程中断");}System.out.println("线程结束");}}publicclassMultiplyThread{publicstaticvoidmain(String[]args)throwsInterruptedException{MusicThreadmt=newMusicThread();开始();尝试{Thread.sleep(1000);mt.interrupt();//意思是超过1秒就会中断线程执行}catch(InterruptedExceptione){//e.printStackTrace();System.out.println("中断线程");}}}六、线程同步synchronized()多线程,线程同步问题包com.abbott;classFather{privateStringname="刘健";publicStringgetName(){返回名称;}}classMusicThreadextendsFatherimplementsRunnable{staticintcount=0;//公共资源privateint=0;privatesynchronizedvoidincrease(){count++;}@Overridepublicvoidrun(){for(intx=0;x<100;x++){increase();System.out.println(Thread.currentThread().getName()+":"+count);//System.out.println(Thread.currentThread().getName()+":"+t++);}}}publicclassMultiplyThread{publicstaticvoidmain(String[]args)throwsInterruptedException{//创建一个多线程对象MusicThreadmt=newMusicThread();Threadt1=newThread(mt,"雅培");线程t2=新线程(mt,"liu");Threadt3=newThread(mt,"你好");//设置每个对象的名称t1.start();t2.开始();t3.开始();}}
