/*
栗子 通过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. Shell变量相关

    li@ubuntu:~/test$ vi test.sh li@ubuntu:~/test$ cat test.sh #!/bin/bash #shell变量不加引号;加单引号;加双引号都行 url= ...

  2. mysql命令(三)

    创建一个名字为Student库: create database Student; 用以下地命令来查看创建的数据库是否成功: show databases; 进入数据库: use Student; 用 ...

  3. centos7 安装zabbix

    一.安装mysql 1.[root@iZ28gvqe4biZ ~]# rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.n ...

  4. Tomcat配置Manager管理员

    修改文件: D:\MyDev\Tomcat\apache-tomcat-7.0.68\conf\tomcat-users.xml  配置内容: <role rolename="mana ...

  5. 将表单序列化为JSON对象

    将表单序列化为JSON对象的工具方法: $(function() { //工具方法,可以将指定的表单中的输入项目序列化为JSON数据 $.fn.serializeJson = function() { ...

  6. 【js】手机浏览器端唤起app,没有app就去下载app 的方法

    这种功能的作用: 1.一般公司有自己的app,而app是需要不断有新用户涌入才能持续运营,达到不错的收入.就需要使用这种方式进行引入新的用户. 2.一些内容在网页端体验不好,或者一些功能需要app内才 ...

  7. Lucene的入门

    Lucene准备 Lucene可以在官网上下载,我这里已经下载好了,用的是4.10.3版本的, 解压以后的文件为: 如果没有使用maven管理的话,就需要引入这三个jar包,实现lucene功能. 我 ...

  8. diff 命令实用

    1.概述 本文将要讨论的是diff命令,diff用来比较两个文件.当然文件比较的工具很多,windows系统下面就有不错的工具可以使用,例如常用的Beyond Compare,WinMerge都是图形 ...

  9. Sublime Text安装与配置

    1.1 下载安装Sublime Text 3 参考博客:https://www.cnblogs.com/Rising/p/3741116.html 1.下载安装Sublime Text 3  1. 下 ...

  10. 20145315何佳蕾《网络对抗》Web安全基础

    20145315何佳蕾<网络对抗>Web安全基础 1.实验后回答问题 (1)SQL注入攻击原理,如何防御 SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页 ...