Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞
Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞
(一)多线程使用方法
说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法)
class Xc3 extends Thread
{
public void run()
{
System.out.println( Thread.currentThread().getName()+"在执行");
} //显示当前线程名称
}
public class L6_3
{
public static void main(String[] args)
{
Xc3 xc31=new Xc3();
xc31.setName("线程1");
xc31.start();
Xc3 xc32=new Xc3();
xc32.setName("线程2");
xc32.start();
Xc3 xc33=new Xc3();
xc33.setName("线程3");
xc33.start();
System.out.println( Thread.currentThread().getName()+"在执行");
}
}
(二)设置线程的优先级
说明:你想要提高优先级的线程调用setPriority方法即可,例如线程2 提高优先级的事例如下:xc2.setPriority(Thread.NORM_PRIORITY + 3);。3表示增加的优先级,数字越大,优先级越大。
public class L6_4 {
public static void main(String[] args)
{
Thread xc1 = new Thread(new Xc41());
Thread xc2 = new Thread(new Xc42());//线程默认级别是5
xc2.setPriority(Thread.NORM_PRIORITY + 3); //数字越大优先级越高
xc1.start();
xc2.start();
}
}
class Xc41 implements Runnable {
public void run() {
for(int i=0; i<100; i++) {
System.out.println("1线程" + i);
}
}
}
class Xc42 implements Runnable {
public void run() {
for(int i=0; i<100; i++) {
System.out.println("第2个线程正在被执行: " + i);
}
}
}
(三)线程睡眠
说明:3点
1. 想要线程睡眠直接调用sleep函数即可,这个sleep是个静态函数,所以可以用类名调用。2.本例的示例:Thread.sleep(1000); //1000毫秒等于1秒。其实也就这一句话。
3.后面的线程让步,线程阻塞,和开始的线程,其实也就是类似这样的一句话。
public class L6_5
{
public static void main(String[] args)
{
Xc5 xc5 = new Xc5();
Thread ccc = new Thread(xc5);
ccc.start();
}
}
class Xc5 implements Runnable
{
public void run() //throws Exception
{
for (int i=0; i<10; i++)
{
System.out.println(Thread.currentThread().getName() + " " + i);
try
{
Thread.sleep(1000); //1000毫秒等于1秒
}
catch (Exception e)
{
}
}
}
}
(四)进程让步
说明:
- 核心代码:Thread.yield();
代码:
public class L6_6
{
public static void main(String[] args)
{
Xc6 xc6 = new Xc6();
Thread aa = new Thread(xc6);
Thread bb = new Thread(xc6);
aa.setName("线程一");
bb.setName("线程二");
aa.start();
bb.start();
}
}
class Xc6 implements Runnable
{
public void run()
{
for(int i=1;i<=30;i++)
{
System.out.println(Thread.currentThread().getName()+": "+i);
if(i%5==0)
{
Thread.yield();
}
}
}
}
运行结果:
线程一: 1
线程二: 1
线程一: 2
线程二: 2
线程一: 3
线程二: 3
线程一: 4
线程二: 4
线程一: 5
线程二: 5
线程一: 6
线程二: 6
线程一: 7
线程二: 7
线程一: 8
线程二: 8
线程一: 9
线程二: 9
线程一: 10
线程二: 10
线程二: 11
线程一: 11
线程二: 12
线程一: 12
线程二: 13
线程一: 13
线程二: 14
线程二: 15
线程一: 14
线程二: 16
线程一: 15
线程二: 17
线程一: 16
线程二: 18
线程一: 17
线程二: 19
线程二: 20
线程二: 21
线程二: 22
线程二: 23
线程二: 24
线程二: 25
线程二: 26
线程二: 27
线程二: 28
线程二: 29
线程二: 30
线程一: 18
线程一: 19
线程一: 20
线程一: 21
线程一: 22
线程一: 23
线程一: 24
线程一: 25
线程一: 26
线程一: 27
线程一: 28
线程一: 29
线程一: 30
结果说明:
在结果中可以发现线程一在5,10,15的时候都让给线程二执行了,20,25,30的时候无人可让,所以就接着自己执行。
(五)进程阻塞
说明:
- 阻塞时将当前线程暂停,直至调用join函数所对应的线程执行完毕,才继续执行程序。
- 核心代码:dd.join();//dd是线程名字
代码:
public class L6_7
{
public static void main(String args[])
{
Xc7 xc7=new Xc7();
Thread dd = new Thread(xc7);
dd.start();
try{
dd.join(); //阻塞时将当前线程暂停,直至调用join函数所对应的线程执行完毕,才继续执行程序。
}
catch(Exception e)
{
}
for(int i=0;i<15;i++){
System.out.println("主线程:" + i);
}
}
}
class Xc7 implements Runnable {
public void run() {
for(int i=0;i<10;i++) {
System.out.println("子线程: " + i);
}
}
}
结果:
子线程: 0
子线程: 1
子线程: 2
子线程: 3
子线程: 4
子线程: 5
子线程: 6
子线程: 7
子线程: 8
子线程: 9
主线程:0
主线程:1
主线程:2
主线程:3
主线程:4
主线程:5
主线程:6
主线程:7
主线程:8
主线程:9
主线程:10
主线程:11
主线程:12
主线程:13
主线程:14
结果说明:
子线程执行完了才是主线程。
Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞的更多相关文章
- Java中各种集合(字符串类)的线程安全性!!!
Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...
- java中的IO流和多线程
1.如何用file操作目录和文件? java对待目录和文件统一使用file来表示,在创建file对象时,使用isDictionary和isFile方法进行判断 package test; import ...
- java中最简单的方式新起一个线程
启动一个线程在一个方法中启动一个线程,有两种方法第一种是让类实现Runable接口,这样的话编译器就会提示你实现里面的未实现的方法(就是run方法)第二种是,现在方法中new一个线程,然后直接调用他的 ...
- java中那些类是线程安全的?
Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...
- java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)
本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: package com.zejian.test; /** * @author ...
- java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)
CPU:10核 主频100MHz 1核 主频 3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
- 【万字图文-原创】 | 学会Java中的线程池,这一篇也许就够了!
碎碎念 关于JDK源码相关的文章这已经是第四篇了,原创不易,粉丝从几十人到昨天的666人,真的很感谢之前帮我转发文章的一些朋友们. 从16年开始写技术文章,到现在博客园已经发表了222篇文章,大多数都 ...
- Java中线程的状态及其转化
线程状态转化图: 说明: 线程总共包括以下5种状态. 1.新状态New:该状态也叫新建状态,当线程对象被创建后,线程就进入了新建状态.例如:Thread thread = new Thread();. ...
- 【Java_多线程并发编程】基础篇—线程状态及实现多线程的两种方式
1.Java多线程的概念 同一时间段内,位于同一处理器上多个已开启但未执行完毕的线程叫做多线程.他们通过轮寻获得CPU处理时间,从而在宏观上构成一种同时在执行的假象,实质上在任意时刻只有一个线程获得C ...
随机推荐
- J2那几个E和Web基础
收到PHP童鞋的反馈: 我觉得不用讲太基础的语法,基础语法大家自己去看,主要讲讲java web开发的一个流程,从开始写代码,到编译,发布,上线,回滚整个流程 大体上的环节,以及需要用到哪些工具 具体 ...
- HTTP相关整理(上)
这次整理HTTP相关知识点的初衷是因为项目中有大量与网络请求相关的知识细节点,所以这次整理的更多的是日常中用得到的点(参考图解HTTP),另外给打算做FE的新人们一些建议:多重视网络这方面的知识.文章 ...
- JDBC连接数据库实现删除功能
这次同样运用之前写过的部分代码进行改变,实现一个删除功能,这个功能很好添加,表单中只要form一个参数到DeleteServlet中,所以重点的代码还是在DeleteServlet中实现业务逻辑. 我 ...
- Quartz.NET总结(六)了解Jobs 和 Triggers
前面讲了一些Quartz.net 的一些东西, http://www.cnblogs.com/zhangweizhong/category/771057.html 但是发现有一些基础的东西,没有说到. ...
- C#.Net面试题
点这里,有很多篇<C#..Net经典面试题02> 在线阅读本文:http://3y.uu456.com/bp_5dcve363vi7px008u2lt_1.html C#..Net经典面试 ...
- 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 2
事件要到那里去? 每个事件源处理类都维护着一个自己的事件队列, 在Monkey中叫做CommandQueue,里面装的是每个具体的MonkeyEvent事件.当来自网络的字串命令被翻译成对应的Monk ...
- 老李分享:jvm结构简介 2
2.2.4 Program counter regsiters:程序计数器 类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当 ...
- String, StringBuilder, StringBuffer问题
1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...
- Xmpp实现简单聊天系列 --- ②用户注册和登陆
不管是注册还是登陆,亦或是聊天等功能,都必须先进行服务器连接,连接代码如下 ①自定义Xmpp连接工具类: ②调用创建连接的方法: ③连接服务器方法: *注意 连接方式为客服 ...
- WPF自定义控件(2)——图表设计[1]
0.小叙闲言 除了仪表盘控件比较常用外,还有图表也经常使用,同样网上也有非常强大的图表控件,有收费的(DEVexpress),也有免费的.但我们平时在使用时,只想简单地绘一个图,控件库里面的许多功能我 ...