Java多线程学习(一)

原创 2016年08月29日 10:17:11

创建一个线程主要有两个方法:实现Runnable接口和继承Thread类。虽然Thread类底层也实现了Runnable接口,但在使用的时候两者还是有很大差别。

1. 继承Runnable接口:

public class TestRunnable implements Runnable{
    private String name;    //给线程一个名称,方便标识

     public TestRunnable(String name){
        this.name = name;
    }

    @Override
    public void run(){
        for(int i=0; i<10; i++){
            System.out.println(name+"正在运行:"+"   "+i);
        }
    }

    public static void main(String[] args){
        TestRunnable t1 = new TestRunnable("A");
        TestRunnable t2 = new TestRunnable("B");

        Thread thread1 = new Thread(t1);    //用实现Runna接口的对象来创建线程
          Thread thread2 = new Thread(t2);

        thread1.start();
        thread2.start();
    }
}
运行结果为:

A正在运行:   0
B正在运行:   0
A正在运行:   1
B正在运行:   1
A正在运行:   2
B正在运行:   2
A正在运行:   3
A正在运行:   4
B正在运行:   3
A正在运行:   5
B正在运行:   4
A正在运行:   6
B正在运行:   5
A正在运行:   7
B正在运行:   6
A正在运行:   8
B正在运行:   7
A正在运行:   9
B正在运行:   8
B正在运行:   9

再运行一次,发现结果不一样:

A正在运行:   0
B正在运行:   0
A正在运行:   1
B正在运行:   1
A正在运行:   2
B正在运行:   2
A正在运行:   3
A正在运行:   4
A正在运行:   5
A正在运行:   6
A正在运行:   7
A正在运行:   8
A正在运行:   9
B正在运行:   3
B正在运行:   4
B正在运行:   5
B正在运行:   6
B正在运行:   7
B正在运行:   8
B正在运行:   9

这是因为每次在运行中,线程都要抢夺CPU资源,由于优先级不同,最终执行的顺序和结果也不同。

2. 继承Thread类:

public class TestThread extends Thread{
    private String name;

    public TestThread(String name) {
        this.name = name;
    }

    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(name + "正在运行   " + i);
        }
    }

    public static void main(String[] args) {
        TestThread h1 = new TestThread("A");
        TestThread h2 = new TestThread("B");
        h1.start();
        h2.start();
    }
}
运行结果:

A正在运行   0
B正在运行   0
A正在运行   1
B正在运行   1
A正在运行   2
B正在运行   2
A正在运行   3
B正在运行   3
A正在运行   4
B正在运行   4
A正在运行   5
B正在运行   5
A正在运行   6
B正在运行   6
A正在运行   7
B正在运行   7
A正在运行   8
A正在运行   9
B正在运行   8
B正在运行   9

3. Thread与Runnable比较:

看上去Thread的写法更简洁,只需要创建对象并start就好。如果不使用公共资源,确实用Thread更方便。但如果有一个变量是多个线程间共享的,怎么办?

在TestThread对象中增加一个字段count。

public class TestThread extends Thread{
    private String name;
    private int count = 10;

    public TestThread(String name) {
        this.name = name;
    }

    public void run() {
        for (int i = 0; i < 10; i++) {
            --count;
            System.out.println(name + "正在运行   " + i + "   count还有"+count);
        }
    }

    public static void main(String[] args) {
        TestThread h1 = new TestThread("A");
        TestThread h2 = new TestThread("B");
        h1.start();
        h2.start();
    }
}
结果怎样可以猜出来,这根本是两个对象,各计算各的。

A正在运行   0   count还有9
B正在运行   0   count还有9
B正在运行   1   count还有8
B正在运行   2   count还有7
B正在运行   3   count还有6
B正在运行   4   count还有5
B正在运行   5   count还有4
B正在运行   6   count还有3
B正在运行   7   count还有2
B正在运行   8   count还有1
A正在运行   1   count还有8
B正在运行   9   count还有0
A正在运行   2   count还有7
A正在运行   3   count还有6
A正在运行   4   count还有5
A正在运行   5   count还有4
A正在运行   6   count还有3
A正在运行   7   count还有2
A正在运行   8   count还有1
A正在运行   9   count还有0

那如果换成static类型的变量呢?static为类的所有对象维护一个公共变量。

A正在运行   0   count还有9
B正在运行   0   count还有8
A正在运行   1   count还有7
B正在运行   1   count还有6
A正在运行   2   count还有5
B正在运行   2   count还有4
A正在运行   3   count还有3
B正在运行   3   count还有2
B正在运行   4   count还有0
B正在运行   5   count还有-1
B正在运行   6   count还有-2
B正在运行   7   count还有-3
B正在运行   8   count还有-4
B正在运行   9   count还有-5
A正在运行   4   count还有1
A正在运行   5   count还有-6
A正在运行   6   count还有-7
A正在运行   7   count还有-8
A正在运行   8   count还有-9
A正在运行   9   count还有-10

乍一看似乎不错,但如果仔细观察,会发现顺序和数字根本不对。所以用Thread不能正确的实现资源共享。




版权声明:本文为博主原创文章,未经博主允许不得转载。

Java多线程学习(吐血超详细总结)

本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。...
  • Evankaka
  • Evankaka
  • 2015年03月14日 13:13
  • 68048

Java多线程学习(吐血超详细总结)

目录(?)      转自:http://blog.csdn.net/evankaka/article/details/44153709#t8 本文主要讲了java中多线程的...
  • evan_shc
  • evan_shc
  • 2016年01月10日 22:08
  • 1208

跟着实例学习java多线程1-为什么使用?

如今的互联网时代、移动互联网时代,我们开发的所有的系统和网站以及服务都要求支持高负载、大并发,要求的是效率,串行的代码已经不能满足我们对执行效率的需求,当然也会白瞎了如今这么好的硬件,现在是个台式机至...
  • andy_gx
  • andy_gx
  • 2015年01月17日 23:38
  • 728

java学习视频day01多线程Thread

package cn.itcast.thread; /* 线程: 多线程的好处: 多线程解决了在一个进程中同时可以执行多个任务代码的问题。 自定义线程的创建方式: 方式一:继承Threa...
  • honghong75042
  • honghong75042
  • 2016年10月13日 09:18
  • 349

JAVA多线程与并发学习总结

一、 什么是并发 在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。 这里需要注意并发和并行...
  • sinat_29581293
  • sinat_29581293
  • 2017年03月01日 10:51
  • 1082

《java多线程编程核心技术》读书笔记1

第一章:java多线程技能 在学习线程之前我们首先要清楚一下进程的概念:            进程是操作系统结构的基础,是系统进行资源分配的和调度的独立单位。window...
  • GODBAR
  • GODBAR
  • 2016年09月03日 08:15
  • 742

成为顶级Java程序猿必看的5本书

转载:http://q.maiziedu.com/article/23323/  以下推荐的几本书籍都是针对Java有一定基础的并且想提高Java编程能力的伙伴儿。如果你想学习Java基础,...
  • znb769525443
  • znb769525443
  • 2016年03月30日 21:51
  • 2599

系统学习java高并发系列三

首先需要说说线程安全?关于线程安全一直在提,比如StringBuilder和StringBuffer有什么区别? 经常就会出现关于线程安全与线程非安全,可能一直在提自己没有细细想想,如果忽然问你啥是线...
  • lirenzuo
  • lirenzuo
  • 2017年07月23日 16:00
  • 1429

《Java多线程编程核心技术》(一)多线程技能

最近阅读了一本《Java多线程编程核心技术》,总结了一下每章的知识点:第一章,java多线程技能 知识点:1,实现多线程编程的方式主要有两种:一是继承Thread类,重新run方法,二是实现Runna...
  • wfzczangpeng
  • wfzczangpeng
  • 2016年09月20日 23:04
  • 855

Java多线程看着一篇足够了!

引 如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来...
  • heroguo007
  • heroguo007
  • 2016年11月15日 15:25
  • 698
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java多线程学习(一)
举报原因:
原因补充:

(最多只允许输入30个字)