线程分享

来源:互联网 发布:centos jira mysql 编辑:程序博客网 时间:2024/06/17 20:55

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 args7. */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
原创粉丝点击