/*
栗子 通过Runnable接口实现简历线程实例 */ class Dog implements Runnable{
//重写run函数
public void run(){
int times = 0 ;
while(true){
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
times++;
System.out.println("hello ,thread_world! " + times);
if(times==10){
break;
}
} }
}
public class Test_Thread {
public static void main(String[] args){
Dog dog = new Dog();
Thread t = new Thread(dog);
t.start();
}
}
【结果】

"C:\Program Files\Java\jdk1.7.0_67\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.3\lib\idea_rt.jar=6342:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_67\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_67\jre\lib\rt.jar;D:\zidonghua\java_test_one\target\test-classes" Test_Thread
hello ,thread_world! 1
hello ,thread_world! 2
hello ,thread_world! 3
hello ,thread_world! 4
hello ,thread_world! 5
hello ,thread_world! 6
hello ,thread_world! 7
hello ,thread_world! 8
hello ,thread_world! 9
hello ,thread_world! 10

Process finished with exit code 0

/*
栗子 多线程实例
1. 一个线程通过接受n来执行1+..+n
2. 另一个线程每隔1秒输出一次hello world! */ class Pig implements Runnable{
int n = 0;
int times = 0;
public Pig(int n){
this.n = n;
}
public void run(){
while(true){
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
times++;
System.out.println("我是一个线程,正在输出第" + times + "个hello world!");
if(times == this.n){
break;
}
}
}
} //算术题
class Bird implements Runnable{
int n = 0;
int res = 0;
int times = 0;
public Bird(int n){
this.n = n;
} public void run(){
while(true){
try{
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}
res += (++times);
System.out.println("当前结果是:"+ res);
if(times == this.n){
System.out.println("最后结果是:" + res);
break;
}
}
}
}
public class Test_Thread {
public static void main(String[] args){
Pig pig = new Pig(5);
Bird bird = new Bird(5);
Thread t1 = new Thread(pig);
Thread t2 = new Thread(bird);
t1.start();
t2.start(); }
}
【结果】

我是一个线程,正在输出第1个hello world!
当前结果是:1
我是一个线程,正在输出第2个hello world!
当前结果是:3
我是一个线程,正在输出第3个hello world!
当前结果是:6
我是一个线程,正在输出第4个hello world!
当前结果是:10
我是一个线程,正在输出第5个hello world!
当前结果是:15
最后结果是:15

/*
栗子 深入理解 线程对象只能启动一个线程 不论继承Thread或实现Runnable接口都不能使用start启动同一个线程2次 */ class Cat extends Thread{
public void run(){
System.out.println("11");
}
} class Dog implements Runnable{
public void run(){
System.out.println("2");
}
}
public class Test_Thread {
public static void main(String[] args){
Cat cat1 = new Cat();
cat1.start(); Dog dog1 = new Dog();
Thread t = new Thread(dog1);
t.start();
t.start(); }
}
【结果】

Exception in thread "main" 11
2
java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:705)
at Test_Thread.main(Test_Thread.java:26)

两种创建线程的⽅法的区别
创建线程有两种⽅法: 1、继承Thread; 2、实现Runnable接⼝; 这两种⽅法有什么区别?
⽤实现Runnable接⼝的特点
1、⽤实现Runnable接⼝的⽅法创建对象可以避免java单继承机制带来的局限;
2、⽤实现Runnable接⼝的⽅法,可以实现多个线程共享同⼀段代码(数据);
因此建议⼤家如果你的程序有同步逻辑需求,则使⽤Runnable的⽅法来创建线程。
java线程的同步--提出问题
多线程的并发,给我们编程带来很多好处,完成更多更有效率的程序。但是也给我们带来
线程安全问题。
java线程的同步--解决问题
解决问题的关键就是要保证容易出问题的代码的原⼦性, 所谓原⼦性就是指:当a线程在
执⾏某段代码的时候,别的线程必须等到a线程执⾏完后,它才能执⾏这段代码。 也就是
排队⼀个⼀个解决。
java处理线程两步的⽅法⾮常简单,只需要在需要同步的代码段,⽤:
synchronized(Object){你要同步的代码}

java线程的同步--解决问题
对同步机制的解释:
java任意类型的对象都有⼀个标志位,该标志位具有0、 1两种状态,其开始状态为1,
当某个线程执⾏了synchronized(Object)语句后, object对象的标志位变为0的状态,直到
执⾏完整个synchronized语句中的代码块后,该对象的标志位⼜回到1状态。
当⼀个线程执⾏到synchronized(Object)语句的时候,先检查Object对象的标志位,如
果为0状态,表明已经有另外的线程正在执⾏synchronized包括的代码,那么这个线程将暂
时阻塞,让出CPU资源,直到另外的线程执⾏完相关的同步代码,并将Object对象的标志
位变为状态,这个线程的阻塞就被取消,线程能继续运⾏,该线程⼜将Object的标志位变
为0状态,防⽌其它的线程再进⼊相关的同步代码块中。
如果有多个线程因等待同⼀个对象的标志位⾯⽽处于阻塞状态时,当该对象的标志位恢
复到1状态时,只会有⼀个线程能够进⼊同步代码执⾏,其它的线程仍处于阻塞的状态。
特别说明:
1、上⾯所说的标志位⽤术语讲就是对象锁,⽂件锁。数据库会有⾏锁、表锁等
2、 synchronized(object)//object(就是对象锁)可以是任意类型对象

												

【Java】【线程】的更多相关文章

  1. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  2. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  3. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  4. 细说进程五种状态的生老病死——双胞胎兄弟Java线程

    java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...

  5. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  6. 第24章 java线程(3)-线程的生命周期

    java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...

  7. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  8. 第22章 java线程(2)-线程同步

    java线程(2)-线程同步 本节主要是在前面吃苹果的基础上发现问题,然后提出三种解决方式 1.线程不安全问题 什么叫线程不安全呢 即当多线程并发访问同一个资源对象的时候,可能出现不安全的问题 对于前 ...

  9. 第21章 java线程(1)-线程初步

    java线程(1)-线程初步 1.并行和并发 并行和并发是即相似又有区别: 并行:指两个或者多个事件在同一时刻点发生. 并发:指两个或多个事件在同一时间段内发生 在操作系统中,并发性是指在一段事件内宏 ...

  10. [转]Java线程安全总结

    最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: java线程安全,java垃圾收集,java并发包详细介绍,java profi ...

随机推荐

  1. node.js核心技术

    一.知识结构: http模块:配置简单 的web服务,npm/cnpm工具 express框架:express中间件进行服务配置:路由:请求处理: DB服务:学习使用mysql关系型数据库: web接 ...

  2. Linux文件管理和编辑常用命令

    Linux文件管理和编辑常用命令 mkdir 命令 功能说明 mkdir 命令用于创建一个目录,mkdir是make directory的缩写 格式: mkdir [选项] 目录名 mkdir 命令的 ...

  3. jQuery的ajaxFileUpload上传插件——刷新一次才能再次调用触发change

    这个问题并不是由change事件失效造成的,而是ajaxFileUpload插件造成的,它会把原来的file元素替换成新的file元素,所以之前绑定的change事件就失效了. 查了一些资料,有些朋友 ...

  4. Caterpillar sis service information training and software

    Cat et sis caterpillar heavy duty truck diagnostics repair. Training demonstration allows.cat electr ...

  5. mac shell终端编辑命令行快捷键——行首,行尾

    Ctrl + d        删除一个字符,相当于通常的Delete键(命令行若无所有字符,则相当于exit:处理多行标准输入时也表示eof) Ctrl + h        退格删除一个字符,相当 ...

  6. python类的__slots__属性、__del__属性、上下文(__enter__和__exit__)、

    常规情况下,类的属性字典是共享的,而实例的字典是独立的.如果一个类的属性较少,但是拥有很多的实例,这些实例的属性字典会占用较多的内存空间.对这样的类来说,为了节省内存空间,可以使用__slots__类 ...

  7. hibernate 和mybatis

    hibernate 和mybatis 你觉得选哪个?原因? Mybatis优势 MyBatis可以进行更为细致的SQL优化,可以减少查询字段. MyBatis容易掌握,而Hibernate门槛较高. ...

  8. 标准库 time

    go语言的time包 1. 组成 time.Duration(时长,耗时) time.Time(时间点)time.C(放时间点的管道)[ Time.C:=make(chan time.Time) ]t ...

  9. centos-6.5安装部署LNMP环境

    安装部署前,确保安装了gcc和gcc-c++ 系统信息: [root@zww ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@ ...

  10. 对浏览器攻击:MS10-002

    对浏览器攻击:MS10-002 MS10-002漏洞介绍 针对微软Internet Explorer"极光"内存损坏的攻击,当用户查看特制网页时允许远程执行代码. 实践过程 命令行 ...