java多线程学习一
声明:本篇博客是本人为了自己学习保存的心得,其内容主要是从大神——五月的仓颉的博客中学习而来,在此多谢大神五月的仓颉的分享,敬礼!
第一章:进程和线程的概念
进程:进程是操作系统中作为分配资源的基本单位,计算机系统上的每一个运行的程序都需要一个进程,而每一个进程的运行需要new一块内存,然后操作系统会把一块物理内存映射到这个进程的地址空间;
线程:线程作为独立运行和独立调度的基本单位,进程中每一个独立的子任务就是一个线程。本博主要讲线程(基于java)
下面是一个demo:
第一种方式、创建一个线程,继承 Thread
 public class MyThread extends Thread {
     public void run(){
         for (int i = 0; i <5; i++) {
             try {
                 Thread.sleep(1000);
                 System.out.println(Thread.currentThread().getName());
             } catch (InterruptedException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
     }
 }
编写一个main()方法
public class Test {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        for (int i = 0; i <5; i++) {
            try {
                Thread.sleep(500);
                System.out.println(Thread.currentThread().getName());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
运行结果
main
main
Thread-0
main
Thread-0
main
main
Thread-0
Thread-0
Thread-0
我们可以通过上面的demo了解到线程是互相独立的,main线程和Thread-0线程交替运行,其实就是同时运行互不干扰,也就是说一个线程的执行不用等待另一个线程执行完后再执行,这样就大大提高了服务器资源的利用率。
第二种、创建线程的方式是实现Runnable接口,看源码我们可以发现其实 Thread 也实现了Runnable接口,因此实现了Runnable接口后,我们还是需要Thread俩启动线程,如下:
MyThread01 mt0 = new MyThread01();
Thread t = new Thread(mt0);
t.start();
以上两种方式对比,相对来说实现Runnable接口的方式相对好一些,原因:继承是单继承,实现可以多实现,并且实现可以减少程序之间的耦合度。
下面是笔者总结的线程的六种状态:
1、新建状态NEW
new了但是没有启动的线程的状态。比如"Thread t = new Thread()",t就是一个处于NEW状态的线程
2、可运行状态RUNNABLE
new出来线程,调用start()方法即处于RUNNABLE状态了。处于RUNNABLE状态的线程可能正在Java虚拟机中运行,也可能正在等待处理器的资源,因为一个线程必须获得CPU的资源后,才可以运行其run()方法中的内容,否则排队等待
3、阻塞BLOCKED
如果某一线程正在等待监视器锁,以便进入一个同步的块/方法,那么这个线程的状态就是阻塞BLOCKED
4、等待WAITING
某一线程因为调用不带超时的Object的wait()方法、不带超时的Thread的join()方法、LockSupport的park()方法,就会处于等待WAITING状态
5、超时等待TIMED_WAITING
某一线程因为调用带有指定正等待时间的Object的wait()方法、Thread的join()方法、Thread的sleep()方法、LockSupport的parkNanos()方法、LockSupport的parkUntil()方法,就会处于超时等待TIMED_WAITING状态
6、终止状态TERMINATED
线程调用终止或者run()方法执行结束后,线程即处于终止状态。处于终止状态的线程不具备继续运行的能力
java多线程学习一的更多相关文章
- Java多线程学习笔记
		进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ... 
- Java多线程学习(转载)
		Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ... 
- java多线程学习笔记——详细
		一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ... 
- 【转】Java多线程学习
		来源:http://www.cnblogs.com/samzeng/p/3546084.html Java多线程学习总结--线程概述及创建线程的方式(1) 在Java开发中,多线程是很常用的,用得好的 ... 
- JAVA多线程学习笔记(1)
		JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ... 
- Java多线程学习(六)Lock锁的使用
		系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ... 
- Java多线程学习(五)线程间通信知识点补充
		系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ... 
- Java多线程学习(四)等待/通知(wait/notify)机制
		转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79690279 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ... 
- Java多线程学习(三)volatile关键字
		转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ... 
- Java多线程学习(二)synchronized关键字(2)
		转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ... 
随机推荐
- 处理 Java 的“Cannot allocate memory”错误
			今天在配置 DCA 服务器的时候,检验 java 版本的时候忽然遇到了一个 Cannot allocate memory 错误 [root@elcid-prod1 ~]# java -version ... 
- pycharm中导入自写模块时,模块下出现红线
			问题描述: 在pycharm中导入自己写的模块时,得不到智能提示,并在模块名下出现下红线,但是代码可以执行,错误提示为下图所示: 原因:出现 以上情况,是因为文件目录设置的问题,pycharm中的最上 ... 
- HDU 4193 Non-negative Partial Sums(单调队列)
			 题目大意: 给定一个长度为n的循环序列.从n个不同位置開始,问有几个位置使得一下情况成立:全部前缀的和都大等于0(n <=1000000). 下午的训练赛.之前没学过单调队列所以用的线段树 ... 
- MD5,SHA256,时间戳获取
			import hashlib # MD5加密 def jiamimd5(src): m = hashlib.md5() m.update(src.encode('UTF-8')) return m.h ... 
- Linux中的grep和cut
			提取行: grep --color 着色 -v 不包含 提取列: cut -f 列号 提取第几列 -d 分隔符 以什么为分隔符,默认是制表键 局限性:如果分隔符不那 ... 
- msql 2000 使用DBCC CHECK DB 得出错误,槽引用错误
			转自:http://www.cnblogs.com/firstrose/p/4256257.html 某个SQL2000的数据库,在通过备份/还原的方法升级到2005时发生错误: 查找解决方法未果 正 ... 
- 交换机/路由器上的 S口 F口 E口
			S口是serial接口的意思,也叫高速异步串口,主要是连接广域网的V.35线缆用的,说白了就是路由器和路由器连接时候用的,可以用命令设置带宽,一般也就在10M.8M左右.F口是FastEthernet ... 
- C#中字符串的内存分配与驻留池
			完全引用http://www.cnblogs.com/instance/archive/2011/05/24/2056091.html 驻留池:是一张记录了所有在代码中使用字面量声明的字符串实例的引用 ... 
- Django 补充models操作,中间件, 缓存,信号,分页
			1.Model 一对多 补充 models如下: class UserType(models.Model): caption = models.CharField(max_length=16) cla ... 
- PHP连接到mysql的方法--mysqli和PDO
			php连接到mysql数据库,经典的方式就是使用mysql_connect(),具体代码如下: mysql_connect($db_host, $db_user, $db_pass) or die(m ... 
