线程分享

1.什么是线程

   * 线程是程序执行的一条路径, 一个进程中可以包含多条线程.

    *多线程并发执行可以提高程序的效率, 可以同时完成多项工作.

2.什么是多线程(多线程并行和并发的区别)

* 并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU)

* 并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。

3.多线程的实现方式

多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程

通过查看源码,thread实现了runnable接口


①.继承Thread

package it.thread;

public class Test1 extends Thread {
	/**
	 * 手动重写run方法
	 */
	public void run() {
		//super.run();
		for (int i = 0; i <1000; i++) {
			System.out.println("aaaaa");
		}
	}
	//结果是aaaabbbb会交替输出
	public static void main(String[] args) {
		Test1 test1 = new Test1();
		//开启线程,调用run方法
		test1.start();
		
		for (int i = 0; i < 1000; i++) {
			System.out.println("bbbb");
		}
	}
}


实现Runnable

package it.runnable;

public class MyRunnable implements Runnable{

	public void run() {
		for (int i = 0; i < 1000; i++) {
			System.out.println("bbbb");
		}
	}
	//结果也是aaabbb乱序交替输出。
	public static void main(String[] args) {
		//接口的子类thread开启线程
		Thread thread = new Thread(new MyRunnable());
		thread.start();
		for (int i = 0; i < 1000; i++) {
			System.out.println("aaaa");
		}
	}
}
当然我们也可以使用匿名内部类来开启多条线程.

1.package it.thread;
2.
3.public class Demo4_Thread {
4.
5.	/**
6.	 * @param args
7.	 */
8.	public static void main(String[] args) {
9.		//继承Thread类
10.		new Thread() {								//1,继承Thread类
11.			public void run() {							//2,重写run方法
12.				for(int i = 0; i < 1000; i++) {				//3,将要执行的代码写在run方法中
13.					System.out.println("aaaaaaaaaaaaaa");
14.				}
15.			}
16.		}.start();									//4,开启线程
17.		//实现Runnable接口
18.		new Thread(new Runnable() {							//1,将Runnable的子类对象传递给Thread的构造方法
19.			public void run() {							//2,重写run方法
20.				for(int i = 0; i < 1000; i++) {				//3,将要执行的代码写在run方法中
21.					System.out.println("bb");
22.				}
23.			}
24.		}).start();									//4,开启线程
25.	}
26.
27.}


4.两种方法的比较

* 继承Thread

         好处是:可以直接使用Thread类中的方法,代码简单

         弊端是:如果已经有了父类,就不能用这种方法

* 实现Runnable接口

        好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的

        弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂

5.常用方法

Thread.sleep(毫秒) :休眠当前线程

Thread.currentThread() :获取当前线程

Thread.get/setName(String) :获取/设置当前线程的名字

Thread.setDaemon(boolean b), 设置一个线程为守护线程, 该线程不会单独执行, 当其他非守护线程都执行结束后, 自动退出

Thread.setPriority(int i):i的取值范围为1到10,数值越大,优先级越高

Thread.yield():礼让线程,让出cpu

6.火车站售票经典实例模仿

package it.runnable;
//火车站售票
public class Test4 {
	public static void main(String[] args) {
		Ticket t = new Ticket();
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
		new Thread(t).start();
	}
}
class Ticket implements Runnable{
	private  int tk = 100;

	public void run() {
		while(true){
			synchronized (Ticket.class) {
				if (tk<=0) {
					break;
				}
				try {
                                  //睡0.1秒
                                 Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
				}
		System.out.println(Thread.currentThread().getName() + "...这是第" + tk-- + "号票");
			}
		}
	}
	
}
6.线程安全就是在源码中加入了synchronized锁.
可以查看其源码如:

Vector是线程安全的,ArrayList是线程不安全的

StringBuffer是线程安全的,StringBuilder是线程不安全的

Hashtable是线程安全的,HashMap是线程不安全的



未完待续


最后,这里有一些关于线程问题和解答,大家可以去看一下:http://blog.jobbole.com/76308/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值