Java多线程学习总结--线程概述及创建线程的方式(1)
在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能。
首先先来看一下线程和进程的区别:
1,一个应用程序就是一个进程,一个进程中有一个或多个线程。一个进程至少要有一个主线程。线程可以看做是轻量级的进程。(lightweight process)
2,多个线程可以共享进程的资源。进程之间是独立的,一个进程不能共享其它进程的资源。
3,因为系统创建进程需要为其分配空间,所以创建进程的代价高,创建线程的代价则要小得多。
创建线程的方式:
Java中创建多线程有3中方式:
1,继承Thread类。
一个类继承Thread类并且重写了run方法之后,如果新建这个类的实例,并调用start方法,那么系统就会启动一个新线程,并执行run方法。代码如下:
 public class ThreadApp {
     public static void main(String[] args){
         // 创建线程
         MyThread thread = new MyThread();
         // 启动线程
         thread.start();
     }
 }
 class MyThread extends Thread {
     private int i = 0;
     public void run() {
         for (; i < 5; i++) {
             System.out.println(getName() + ":" + i);
         }
     }
 }
2,实现Runnable接口。
定义一个类实现Runnable接口,然后创建该类的实例,然后创建Thread对象,将Runnable实例作为Thread对象的target,最后调用Thread对象的start方法。在执行是,Thread对象会调用Runnable对象的run方法。代码如下:
public class ThreadApp {
    public static void main(String[] args) {
        // 创建runnable对象
        MyRunnable target = new MyRunnable();
        // 创建thread对象,并将runnable作为thread的target
        Thread thread = new Thread(target);
        // 调用thread的start方法,在线程执行时,会调用target的run方法
        thread.start();
    }
}
class MyRunnable implements Runnable {
    private int i = 0;
    @Override
    public void run() {
        while (i < 500) {
            synchronized (this) {
                System.out
                        .println(Thread.currentThread().getName() + ":" + i++);
            }
        }
    }
}
3,实现Callable接口。
Callable是一个泛型接口,这种创建多线程的方式可以获得线程的执行后的返回值。创建步骤为:定义一个类MyCallable实现Callable接口,创建MyCallable的实例,然后创建FutureTask对象target来包装Callable对象,因为FutureTask类实现了Runnable接口,所以可以作为Thread的target属性。最后创建Thread。当线程执行完毕之后,调用FutureTask的get方法获取的返回值。代码如下:
public class ThreadApp {
    public static void main(String[] args) {
        // 创建Callable对象
        MyCallable callable = new MyCallable();
        // 创建FutureTask对象包装callable,FutureTask类实现了Runnable接口,所以可以作为Thread类的target
        FutureTask<String> target = new FutureTask<>(callable);
        // 创建线程
        Thread thread = new Thread(target);
        // 启动线程
        thread.start();
        try {
            // 获得线程执行结果
            String result = target.get();
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}
class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        synchronized (this) {
            System.out.println(Thread.currentThread().getName());
            Thread.sleep(1000);
            return new Date().toString();
        }
    }
}
三种创建线程方式的比较:
使用Thread创建线程最简单,它有getName()方法可以直接获取当前线程的名称。但是不够灵活。多个线程之间不能共享Thread的属性。
使用Runnable和Callable是一样的,都是先实现这两个接口,然后将实现类的实例作为Thread的target来创建线程。使用Callable接口可以创建带返回值的线程。另外,多个线程之间可以共享target的属性。代码如下:
public class ThreadApp {
    public static void main(String[] args) {
        MyRunnable target = new MyRunnable();
        // 两个线程使用同一个target,可以共享target中的属性
        Thread thread1 = new Thread(target);
        Thread thread2 = new Thread(target);
        thread1.start();
        thread2.start();
    }
}
关于多个线程共享资源的问题,在后边的线程通信会有更好的方法。
Java多线程学习总结--线程概述及创建线程的方式(1)的更多相关文章
- 【转】Java多线程学习
		来源:http://www.cnblogs.com/samzeng/p/3546084.html Java多线程学习总结--线程概述及创建线程的方式(1) 在Java开发中,多线程是很常用的,用得好的 ... 
- [Java多线程]-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
		前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ... 
- Java多线程学习(五)线程间通信知识点补充
		系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ... 
- Java多线程学习篇——线程的开启
		随着开发项目中业务功能的增加,必然某些功能会涉及到线程以及并发编程的知识点.笔者就在现在的公司接触到了很多软硬件结合和socket通讯的项目了,很多的功能运用到了串口通讯编程,串口通讯编程的安卓端就是 ... 
- Java多线程学习(转载)
		Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ... 
- 转:Java多线程学习(总结很详细!!!)
		Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ... 
- Java多线程学习(吐血超详细总结)
		Java多线程学习(吐血超详细总结) 林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实 ... 
- [转]Java多线程学习(总结很详细!!!)
		Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程 ... 
- Java多线程学习笔记
		进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ... 
随机推荐
- RPC简介及原理
			简介 RPC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(本地过程调用). 越底层, ... 
- 在LINUX上创建GIT服务器【转】
			转自:http://blog.csdn.net/xiongmc/article/details/9176785 如果使用git的人数较少,可以使用下面的步骤快速部署一个git服务器环境. 1. Cli ... 
- 对Java“一切皆对象”的理念的理解
			在从HelloWorld到面向对象中,我们将int, float, double, boolean等称为基本类型(primitive type),也就是特殊的类.我们可以将一个整数理解称为一个int类 ... 
- POJ 3494 Largest Submatrix of All 1’s(最大全1子矩阵)
			题目链接:http://poj.org/problem?id=3494 题意:给出一个01的矩阵,找出一个面积最大的全1矩阵. 思路:用h[i][j]表示从位置(i,j)向上连续1的最大长度.之后枚举 ... 
- 【转+分析】JAVA: 为什么要使用"抽象类"? 使用"抽象类"有什么好处?
			老是在想为什么要引用抽象类,一般类不就够用了吗.一般类里定义的方法,子类也可以覆盖,没必要定义成抽象的啊. 看了下面的文章,明白了一点. 其实不是说抽象类有什么用,一般类确实也能满足应用,但是现实中确 ... 
- ListItem选中时只改变文字的颜色
			继承父状态,然后使用Selector 如果是用Linearlayout里面动态添加Linearlayout的情况,就要代码控制了 // 就是为了改变颜色. l ... 
- 使用git submodule管理一个需要多个分立开发或者第三方repo的项目
			在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方 开源repo的更新.另外一方面如果我们自己在开发一个网站的项目,这个项目 ... 
- BZOJ 1010 玩具装箱
			斜率优化. 事实上是选一个大于某个数的最小斜率.维护下凸壳. #include<iostream> #include<cstdio> #include<cstring&g ... 
- HDU5400 Arithmetic Sequence
			解题思路:这题看懂题目是很关键的,这个区间是等差数列,且公差为d1或d2, 特别注意单个数字也为等差数列.每次求出等差数列序列长度,然后 求出对应这种长度对应有多少种组合方式,累加起来就是结果. ... 
- 剑指offer-第三章高质量的代码(调整数组顺序使得奇数位于偶数的前面)
			题目:输入一个整数数组,实现一个函数中调整该数组中数字的顺序,使得所有的奇数位于数组的前半部,所有偶数位于数组的后半部. 思路:用两个指针p1和p2,分别指向数组的头和尾部,p1只向后移,p2只向前移 ... 
