Java多线程
线程代表独立的执行空间。
Thread是java中用来表示线程的类。要建立线程就得创建Thread。
JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
1、继承Thread类实现多线程
/**
*
* @author JMZHANG
*两种实现多线程的方法
*第一种
*1.继承java.lang.Thread类
*2.重写run方法
*/
public class ThreadTest02 {
public static void main(String[] args) {
//父类的方法指向子类的对象
Thread t1=new MyThread();
t1.start();
for(int i=1;i<10;i++){
System.out.println("main*******"+i);
}
}
}
class MyThread extends Thread{
//重写run方法
public void run(){
for(int i=1;i<50;i++){
System.out.println("------"+i);
}
}
}
2、实现Runnable接口方式实现多线程
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口
/**
*
* @author JMZHANG
*
*第二种创建线程的方法
*1.实现接口java.lang.Runnable
*2.实现run方法
*推荐使用第二种方法
*
*因为单继承 所以通过接口方式实现多线程保留了继承权
*
*产生就绪运行消亡阻塞
*/
public class ThreadTest03 {
public static void main(String[] args) {
//start方法属于Thread类
Thread01 t1=new Thread01();
Thread t =new Thread(t1);
t.start();
for(int i=1;i<10;i++){
System.out.println("main*******"+i);
}
}
}
class Thread01 implements Runnable{
public void run(){
for(int i=1;i<50;i++){
System.out.println("------"+i);
}
}
}
因为thread本身就是实现runnable接口的,所以我们也可以这样启动线程
1、建立Runnable对象(线程的任务)
Runnable runnable=new Runnable()
2、建立Thread对象(工人)并赋值Runnable(任务)
Thread thread=new Thread(runnable);
3、启动Thread
thread.start();
首先我们写一个简单的程序实现runnable接口来建立给thread运行的任务
//Runnable 是java.lang包下的,不需要import
public class MyRunnable implements Runnable{
//只有这一个方法需要实现,把要运行的程序放在这里
public void run() {
go();
}
public void go() {
doMore();
}
public void doMore() {
System.out.println("top o' the stack");
}
}
public class ThreadTester {
public static void main(String[] args) {
Runnable runnable = new MyRunnable();
//将runnable的实例传给thread的构造函数
Thread myThread=new Thread(runnable);
//要调用start()方法才能让线程开始执行
//在此之前它只是个thread的实例,并不是真正的线程
myThread.start();
System.out.println("back in main");
}
}
多次运行本程序你会发现输出会有不同,有时候主线程会先结束,有时候新建线程会先结束。
我们再看下下面的代码:
public class TestSync implements Runnable{
private int num;
public void run() {
for(int i=0;i<100;i++){
increment();
System.out.println("num is :"+num);
}
}
public void increment() {
int i=num;
num =i+1;
}
}
public class TestSyncTest {
public static void main(String[] args) {
TestSync job=new TestSync();
Thread a=new Thread(job);
Thread b=new Thread(job);
a.start();
b.start();
}
}
运行程序后你会发现输出的数字不是连续的。这是因为a,b两个线程的工作顺序是随机的,可能a刚执行完int i=num;就换成b运行了。
解决方法:
加上synchronized关键字:
public synchronized void increment() {
int i=num;
num =i+1;
}
下面给大家介绍一下线程的常用方法:
/**
*
* 线程的常用方法
* @author JMZHANG
*
*/
public class ThreadTest04 {
public static void main(String[] args) throws Exception {
Thread tt = new Thread(new Thread02());
//获取当前线程 (静态方法)
Thread t1=tt.currentThread();
//线程命名
t1.setName("主线程");
//线程t1休息1ms
t1.sleep(1);
System.out.println(t1.getName());
System.out.println(tt.getName());
}
}
class Thread02 implements Runnable{
public void run() {
Thread t2=Thread.currentThread();
t2.setName("2线程");
}
}
/**
*
*
* @author JMZHANG
*线程的优先级1-10 10最高(概率高!!!!)
*默认为5
*MIN_priority
*/
public class ThreadTest05 {
public static void main(String[] args) {
System.out.println(Thread.MAX_PRIORITY);
System.out.println(Thread.MIN_PRIORITY);
System.out.println(Thread.NORM_PRIORITY);
Thread t1 =Thread.currentThread();
//得到线程优先级
System.out.println(t1.getPriority());
t1.setPriority(Thread.MAX_PRIORITY);
}
}