一、 java多线程
线程达到的效果是能够并发执行
1、java要实现多线程有两种方式:
l 继承Thread类
l 实现Runnable接口
(一)Thread
Thread类:一个方法只要继承了Thread类,此类就成为多线程操作类。在Thread子类中,必须明确覆写Thread类中的run()方法,此方法为线程的主体。多线程的定义语法:
Pulic class 类名称 extends Thread{-----继承Thread类
属性;------------类中的属性
方法;-------------类中的方法
Public void run(){-----------覆写Thread的方法
线程主体;
}
}
2、package com.hx.thread;
import java.security.PublicKey;
public class MyThread extends Thread{
String name;//线程的属性
public MyThread(String name){
this.name=name;
}
public void run(){//覆写Thread中的run方法,是线程的操作主体
for (int i = 0; i < 4; i++) {
System.out.println(name+"--"+i);
}
}
}
public class MyThreadTest {
public static void main(String[] args) {
MyThread m1=new MyThread("线程A");
MyThread m2=new MyThread("线程B");
m1.run();//调用线程主体
m2.run();
}
}
运行结果是:线程A--0
线程A--1
线程A--2
线程A--3
线程B--0
线程B--1
线程B--2
线程B—3
以上调用还是先执行A后执行B,并没有达到并发执行的效果。
还是通过对象名.方法名,如果要想启动一个线程必须使用Thread类中定义的start()方法。
一旦调用start()方法,实际上调用的就是run()方法。
public class MyThreadTest {
public static void main(String[] args) {
MyThread m1=new MyThread("线程A");
MyThread m2=new MyThread("线程B");
m1.start();//调用线程主体
m2.start();
}
}
效果如下:线程B--0
线程A--0
线程A--1
线程A--2
线程B--1
线程A--3
线程B--2
线程B--3
此时达到了并发执行的效果
*****一个线程只能被调用一次。
3、要想实现多线程需要操作系统的支持,因为牵扯到抢占cpu的情况,要等待cpu进行调度,需要使用native调用本机的系统函数。
(二)runnable接口
Runnable的定义语法:
Pulic class 类名称 implements Runnable{-----实现Runnable接口
属性;------------类中的属性
方法;-------------类中的方法
Public void run(){-----------覆写Thread的方法
线程主体;
}
}
如果想启动线程则肯定依靠Thread类,但是之前如果直接继承了Thread类,则可以将start()方法直接继承下来使用,但是Runnable接口中并没有此方法。可以利用public Thread(Runnable target)
这个构造方法。来启动线程
如:public class MyThreadTest {
public static void main(String[] args) {
MyThread m1=new MyThread("x1");
MyThread m2=new MyThread("x2");
Thread t1=new Thread(m1);//实例化Thread类public Thread(Runnable target)
Thread t2=new Thread(m2);
t1.start();//调用线程主体
t2.start();
}
}
Thread类是Runnable 的子类。
Runable接口可以共享资源而Thread则不可以。
(三)Thread和Runnable接口的使用结论
实现Runnable接口比继承Thread类 有如下的明显优点
l 适合多个相同程序代码的线程去处理同一个资源
l 可以避免单继承带来的影响
l 增强了程序的健壮性,能够实现多个进程共享,代码与数据独立
开发中使用Runnable接口是最合适的。
(四)线程的状态
实际上,线程调用start()方法 的时候不是立即启动的,而是等待cpu 进行调度
(五)总结
(1)线程是进程的执行单元。线程消失了进程不会消失,而进程消失了则线程一定会消失。
(2)线程的启动:通过start() 方法完成,需要进行cpu 调度,调用start()实际上就是调用run()方法。
(3)Thread是Runnable的子类,使用了代理机制完成。
(4)开发中使用Runnable接口是最合适的,能够达到资源共享。