复习线程的基本方法

发表时间:2017-09-01 17:11:19 浏览量( 30 ) 留言数( 0 )

学习目标:

1、复习多线程的执行流程,和实现多线程的方法。

2、掌握多线程的一些基本方法。


学习过程:

一、复习Thread和Runnable建立线程

在之前的课程中我们已经学了如何建立多线程的方法了。可以通过继承Thread或者实现Ruannble,然后重写run方法,通过start()方法启动线程,启动后的线程和主线程时两个独立的线程,我们可以通过获得当前的线程名字来区别,代码如下:

通过继承Thread

public class MyThread1 extends Thread{
	
	public void run() {
		System.out.println("MyThread1 当前所在的线程"+Thread.currentThread().getName());
	}

}

或者实现Ruannble

public class MyThread2 implements Runnable{

	public void run() {
		System.out.println("MyThread2 当前所在的线程"+Thread.currentThread().getName());
	}

}

在主线程中通过start启动线程

public class Run1 {
	
	public static void main(String[] args) {
		
		MyThread1 myThread1=new MyThread1();
		myThread1.start();
		
		Thread thread=new Thread(new MyThread2());
		thread.start();
			
		System.out.println("主线程的名字:"+Thread.currentThread().getName());
			
	}

}=

控制台输出如下,可以看到他们时在不同的线程之中运行的,先后的顺序也不固定的。

attcontent/9d3e756f-772c-47d2-bad1-6efa78697708.png

这里我们也展示一下使用JDK 8的新语法定义一个线程,在后面的编码中我们是不是也会使用到这种Lambda的写法。

		Runnable runnable=()->System.out.println("通过Lambda的方式");
		
		Thread thread=new Thread(runnable);
		thread.start();


当然你的Eclipse需要设置成为1.8的编译器模式

attcontent/223c721a-55bb-4a0f-a1aa-3e43eb33e244.png

二、常见方法:

1、isAlive,sleep,

isAlive时判断线程是否还在存活,sleep时让线程休眠一段时间,实例代码如下:

                MyThread1 myThread1=new MyThread1();
		
		System.out.println("启动前:"+myThread1.isAlive());
		
		myThread1.start();
		
		//Thread.sleep(1000);
		System.out.println("这个方法也时有可能为false的,因为线程有可能先结束了。启动后:"+myThread1.isAlive());

2、停止stop,暂停,恢复等方法,这些方法大部分都时已经过期,因为有线程安全性的问题,所以大部分都已经不推荐使用,在以后的版本中会彻底清除出去。我们现在开发应用程序也很少会使用这些方法了。

	public void run() {
		int i = 0;
		while (true) {
            //不断的打印
			System.out.println("i=" + i++);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		//System.out.println("MyThread1 当前所在的线程" + Thread.currentThread().getName());
	}

主线程:

		MyThread1 myThread1=new MyThread1();
	
		myThread1.start();
		
		Thread.sleep(3000);// 3秒后尝试停止
		myThread1.stop();

后台输出了几个后就停止了运行了。

attcontent/95107291-ae2e-4104-9727-6b4cffa65538.png

暂停和恢复方法

		myThread1.suspend();//暂停
		Thread.sleep(8000);// 
		myThread1.resume();//恢复

可以在后台查看一下,线程停止了8秒后才会恢复执行。

3、yield,优先级别,设置守护进程

yield方法会让线程暂时退出CPU的使用,让给其他的线程使用,但是不会释放锁。

实例代码:

	public void run() {
		
		long begin=System.currentTimeMillis();
		
		int sum = 0;
		for (int i = 0; i < 100000; i++) {
			this.yield();//让出了一下CPU
			sum += i;
		}
        System.out.println("sum="+sum);
        long end=System.currentTimeMillis();
        System.out.println((end-begin)+"毫秒");
	}

控制台,可以看到时间比较久了。

attcontent/906076a8-4164-4d79-9990-9689bbf60527.png

2、优先级的设置顾名思义具有更高的优先级,但是调度还是需要操作系统的算法的。所以优先级高的不一定就一定会先执行完毕。

这里就不给演示代码,大家可以自己写两个程序,设置最好优先级和最低优先级,看看那个先运行结束即可。

3、平时我们使用main函数就是一个用户线程,守护进程时相对于用户进程而言,如果没有了用户进程,所有的守护进程也会一起结束得了。比较经典的就是垃圾回收进程就是一个守护进程。

		MyThread1 thread1=new MyThread1();
	    thread1.setDaemon(true);//设置为守护进程,主线程结束了,他也结束了。
	    thread1.start();