java - day017 - 线程
- 进程
- 操作系统中, 并行执行的任务
- 线程
- 进程内部, 并行执行的任务
- 进程包含线程
- 线程的创建
- 继承Thred
- 定义 Thred 的子类
- 重写 run() 方法
- 在 run() 方法中的代码, 是与其他代码并行的代码
- 线程启动后, 自动执行
package day1702_线程; public class Test1 {
public static void main(String[] args) { T1 t1 = new T1();
T1 t2 = new T1(); // 创建线程对象 t1.start(); // 启动线程后, 自动执行
t2.start(); System.out.println("main"); } static class T1 extends Thread{ // 继承线程
@Override
public void run() {
super.run(); super.setName("thred1");// 设置线程名称 super.getName();// 获取线程名 String n = super.getName(); for (int i = ; i < ; i++) {
System.out.println(n+": "+i);
} }
}
}
- 实现 Runnable
- 定义 Runnable 子类
- 实现 run() 方法
- 把 Runnable 对象, 放入Thred 线程对象启动
- 线程启动后, 执行 Runnable 对象的 Run() 方法
package day1702_线程; public class Test2 {
public static void main(String[] args) { R1 r1 = new R1();// 创建 R1 对象
R1 r2 = new R1(); Thread t1 = new Thread(r1); // 创建线程
Thread t2 = new Thread(r2); t1.start(); // 执行线程
t2.start(); } static class R1 implements Runnable{
@Override
public void run() { // 获得 正在执行这行代码的线程对象
Thread t = Thread.currentThread(); // 获得线程名
String n = t.getName();
for (int i = ; i < ; i++) {
System.out.println(n+": "+i);
}
}
} }- 线程的状态
- 新生
- 可执行
- 阻塞
- 执行
- 消亡 即run()结束
- 线程的方法
- Thread.currentThread(); // 获得正在执行这行代码的线程对象
- Thread.sleep(毫秒值) // 当前线程暂停指定的毫秒时间
- iterrupt()
- 打断一个线程的暂停状态, 被打断的线程会出现异常
- InterruptedException
package day1702_线程; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner; public class Test3 {
public static void main(String[] args) {
T1 t1 = new T1();
t1.start(); // main 线程 打断t1 线程的暂停状态
System.out.println("按回车打断 t 线程");
new Scanner(System.in).nextLine(); t1.interrupt(); // 打断
} static class T1 extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run(); SimpleDateFormat sdf =
new SimpleDateFormat("HH:ss:mm"); while (true) {
String s = sdf.format(new Date());
System.out.println(s); // 停一秒
try {
Thread.sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace(); System.out.println("谁TMD桶我");
break; } } }
}
}- join(); //当前线程,等待被调用的线程结束
package day1702_线程; public class Test4 {
public static void main(String[] args) throws InterruptedException {
// 1000万内的质数数量 System.out.println(" 单线程");
f1();
System.out.println("五个线程");
f2(); } private static void f1() throws InterruptedException {
long t = System.currentTimeMillis(); T1 t1 = new T1(,);
t1.start(); // 让main 线程等待 t1 结束
t1.join();
int r = t1.count; t = System.currentTimeMillis() - t;
System.out.println("执行时间: "+t);
System.out.println("质数数量: "+r);
} private static void f2() throws InterruptedException {
// TODO Auto-generated method stub
long t = System.currentTimeMillis(); T1[] a = new T1[];
for (int i = ; i < a.length; i++) {
a[i] = new T1(*i,*(i+));
a[i].start();
} int sum = ;
for (T1 t1 : a) {
t1.join();
sum+=t1.count;
} t = System.currentTimeMillis() - t;
System.out.println("执行时间: "+t);
System.out.println("质数数量: "+sum);
} static class T1 extends Thread{ int from;
int to;
int count; //最终结果,质数的数量 public T1(int from, int to) {
if (from <= ) {
count = ;
from = ;
} this.from = from;
this.to = to;
} @Override
public void run() {
// TODO Auto-generated method stub
super.run(); for (int i = from; i < to; i++) {
if (isPrime(i)) {
count++;
}
} } // 是否是质数
private boolean isPrime(int i) {
double max = +Math.sqrt(i);
for (int j = ; j < max; j++) {
if (i%j == ) {
return false;
}
} return true;
} }
}- Thread.yield();
- 当前线程放弃时间片, 让出 cpu 资源
- getPriority(), setPriority();
- 优先级, 1到10, 默认5
- setDaemon(true);
- 后台线程,守护线程
- 一般所有前台线程结束,虚拟机自动退出
package day1702_线程; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner; public class Test3 {
public static void main(String[] args) {
T1 t1 = new T1();
t1.start(); Thread t2 = new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run(); System.out.println("按回车打断 t 线程");
new Scanner(System.in).nextLine(); t1.interrupt(); // 打断
}
}; t2.setDaemon(true); // 设置后台线程
t2.start();
} static class T1 extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run(); SimpleDateFormat sdf =
new SimpleDateFormat("HH:ss:mm"); for (int i = ; i < ; i++) {
String s = sdf.format(new Date());
System.out.println(s); // 停一秒
try {
Thread.sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace(); System.out.println("谁TMD桶我");
break; }
} }
}
}
- 多线程的数据访问冲突
- 多个线程, 共享访问数据
- 一个线程访问到修改的一半的数据,称为 脏数据
- 线程同步 synchronized
- 多个线程,步调一致的执行
- 让多个线程, 争夺同一个对象的 同步锁
- 谁抢到谁执行, 抢不到等待
- 同步锁
- 任何对象, 都有一个唯一的同步锁
- synchronized
- 遇到同步关键字, 要先抢到锁才能执行,否则等待
- synchronized(对象){ }
- 争夺指定对象的锁
package day1702_线程; import java.util.Arrays; public class Test5 { static char[] a = {'-','-','-','-'};
static char v = '*'; public static void main(String[] args) {
new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run(); while (true) { // 数组同步锁
synchronized (a) {
for (int i = ; i < a.length; i++) {
a[i] = v;
}
v = (v=='*'?'-':'*');
} }
}
}.start(); new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run(); while (true) {
// 数组同步锁
synchronized (a) {
System.out.println(Arrays.toString(a));
} }
}
}.start();
}
}- synchronized void f() { };
- 抢当前对象的锁
package day1702_线程; public class Test6 {
public static void main(String[] args) { R1 r1 = new R1(); Thread t1 = new Thread(r1);
t1.start(); // main 线程死循环 ,检查 i 是否是奇数
while (true) { int i = r1.get();
if (i%==) {
System.out.println(i);
System.exit();// 关闭虚拟机 } }
} static class R1 implements Runnable{ static int i; synchronized public void add(){
i++;
i++;
} synchronized public int get() {
return i;
} @Override
public void run() {
// TODO Auto-generated method stub
while (true) {
add();
}
}
}
}- static synchronized void f() { };
- 抢类的锁
package day1702_线程; public class Test6 {
public static void main(String[] args) { R1 r1 = new R1();
R1 r2 = new R1(); Thread t1 = new Thread(r1);
t1.start(); Thread t2 = new Thread(r2);
t2.start(); // main 线程死循环 ,检查 i 是否是奇数
while (true) { int i = r2.get();
if (i%==) {
System.out.println(i);
System.exit();// 关闭虚拟机 } }
} static class R1 implements Runnable{ static int i; static synchronized public void add(){
i++;
i++;
} static synchronized public int get() {
return i;
} @Override
public void run() {
// TODO Auto-generated method stub
while (true) {
add();
}
}
}
}
java - day017 - 线程的更多相关文章
- java之线程
java之线程 一:线程: 线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...
- Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别
一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...
- Java的线程安全
线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别 ...
- 深入理解Java之线程池
原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
- java 多线程—— 线程让步
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- java 多线程—— 线程等待与唤醒
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java的线程模型
并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系. 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开, ...
- Java多线程 - 线程状态
转自: http://www.cnblogs.com/lwbqqyumidi/p/3804883.html 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的 ...
随机推荐
- Django中的QuerySet查询优化之实例篇
转载的,做个笔记,原文链接 在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子 ...
- python中的随机函数random的用法示例
python中的随机函数random的用法示例 一.random模块简介 Python标准库中的random函数,可以生成随机浮点数.整数.字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据 ...
- layer实现鼠标悬浮效果
; $(document).on('mouseenter', '.layer_hover', function(){ var words = $(this).data('words'); tip_in ...
- 原生JavaScript贪吃蛇
在实例开发过程中还是能认识到很多不足的,并且加强了一些基础. 简单写一下制作过程: 1.创建画布 2.创建蛇和老鼠 坐标不能重叠 3.让蛇移动起来 4.添加死亡方法 5.添加转点坐标和方向 6.添加吃 ...
- Nginx日志挂载目录为nfs文件服务器时开机无法自启动的问题解决
为了方便收集查看日志把nginx日志输出至nfs文件服务器,nfs文件服务器使用autofs自动挂载,nginx和autofs都使用systemctl设置了开机自启动. 但是在重启主机的时候nginx ...
- consui(二)集群配置
consul集群搭建:一.软件安装Linux 环境下载zip包然后直接解压,然后把解压的文mv consul /bin检验安装是否成功,查看版本[root@node1 ~]consul -vConsu ...
- django自带的用户验证是验证username和password,如何自定义验证功能,让mobil也能作为账户名登录?
users.views.pyfrom django.contrib.auth.backends import ModelBackendfrom django.db.models import Qcla ...
- pv回收
学习cloudman中的k8s 152课,创建pod时,需要在k8s-host2 中挂着到在k8s-master 中/nfs中创建的挂载目录,结果提示没有/nfs/pv1 root@k8s-maste ...
- 线性链条件随机场(CRF)的原理与实现
基本原理 损失函数 (线性链)CRF通常用于序列标注任务,对于输入序列\(x\)和标签序列\(y\),定义匹配分数: \[ s(x,y) = \sum_{i=0}^l T(y_i, y_{i+1}) ...
- python scipy包进行GO富集分析p值计算
最近总是有需要单独对某一个类型的通路进行超几何分布的p值计算,这里记录一下python包的计算方法 使用scipy的stat里面的hypergeom.sf方法进行富集分析的p值计算 hsaxxxxx ...