Java多线程

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);
		

	}

}


 

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花月诗人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值