JAVA进阶13
间歇性混吃等死,持续性踌躇满志系列-------------第13天
1、查看线程的运行状态
package code0327;
class Demo01 implements Runnable {
public synchronized void waitForASecond() throws InterruptedException {
wait(500); //使当前线程等待0.5秒或其他线程调用notify()或notifyAll()方法
}
public synchronized void waitForYears() throws InterruptedException {
//使当前线程永久等待,直到其他线程调用notify()或notifyAll()方法
wait();
}
public synchronized void notifyNow() throws InterruptedException {
//唤醒由调用wait()方法进入等待状态的线程
notify();
}
public void run() {
try {
//在线程中运行waitForASecond()方法
waitForASecond();
//在线程中运行waitForYears()方法
waitForYears();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Test {
public static void main(String[] args) throws InterruptedException{
//创建state对象
Demo01 state = new Demo01();
//利用state对象创建Thread对象
Thread thread = new Thread(state);
//输出线程状态
System.out.println("新建线程:"+thread.getState());
//调用thread对象的start()方法,启动新线程
thread.start();
//输出线程状态
System.out.println("启动线程:"+thread.getState());
//当前线程休眠0.1秒,使新线程运行waiForASecond()方法
Thread.sleep(100);
//输出线程状态
System.out.println("计时等待:"+thread.getState());
//当前线程休眠1秒,使新线程运行waiForYears()方法
Thread.sleep(1000);
//输出线程状态
System.out.println("等待线程:"+thread.getState());
//调用state的notifyNow()方法
state.notifyNow();
//输出线程状态
System.out.println("唤醒线程:"+thread.getState());
//当前线程休眠1秒,使新线程结束
Thread.sleep(1000);
//输出线程状态
System.out.println("终止线程:"+thread.getState());
}
}
运行结果图

2、查看JVM的线程名
package code0327; import java.util.ArrayList;
import java.util.List; public class ThreadList {
//获得根线程组
private static ThreadGroup getRootThreadGroups() {
//获得当前线程组
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
while (true){
//如果getParent()方法的返回值非空则不是根线程组
if(rootGroup.getParent()!=null){
//获得父线程组
rootGroup = rootGroup.getParent();
}else {
//如果到达根线程组则退出循环
break;
}
}
//返回根线程组
return rootGroup;
}
//获得线程组中所有的线程名
public static List<String> getThreads(ThreadGroup group){
//创建保存线程名的列表
List<String> threadList = new ArrayList<String>();
//根据活动线程数创建线程数组
Thread[] threads = new Thread[group.activeCount()];
//复制线程到线程数组
int count = group.enumerate(threads,false);
//遍历线程数组将线程名及其所在组保存到列表中
for (int i = 0; i < count; i++) {
threadList.add(group.getName()+"线程组:"+threads[i].getName());
}
return threadList;
}
//获得线程组中子线程组
public static List<String> getThreadGroups(ThreadGroup group){
//获得给定线程组中线程名
List<String> threadList = getThreads(group);
//创建线程组数组
ThreadGroup[] groups = new ThreadGroup[group.activeCount()];
//复制子线程组到线程组数据
int count = group.enumerate(groups,false);
//遍历所有子线程组
for (int i = 0; i < count; i++) {
//利用getThreads()方法获得线程组名李彪
threadList.addAll(getThreads(groups[i]));
}
//返回所有线程名
return threadList;
} public static void main(String[] args) {
for(String string:getThreadGroups(getRootThreadGroups())){
//遍历输出列表中的字符串
System.out.println(string);
}
}
}
运行结果图

3、线程的生命周期

package code0327; import javax.swing.*;
import java.awt.*;
import java.util.Random; public class SleepMethodTest extends JFrame {
private Thread t;
//定义颜色数组
private static Color[] color = {Color.BLACK, Color.YELLOW, Color.RED, Color.PINK, Color.LIGHT_GRAY};
//创建随机对象
private static final Random rand = new Random(); //获取随机颜色值的方法
private static Color getC() {
return color[rand.nextInt(color.length)];
} public SleepMethodTest() {
//创建匿名线程对象
t = new Thread(new Runnable() {
//定义初始坐标
int x = 350;
int y = 450; //覆盖线程接口方法
public void run() {
//无限循环
while (true) {
try {
//线程休眠0.1秒
t.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//获取组件绘图上下文对象
Graphics graphics = getGraphics();
//设置绘图颜色
graphics.setColor(getC());
//绘制直线并递增垂直坐标
graphics.drawLine(x, y, 100, y++);
if (y >= 80) {
y = 50;
}
}
}
});
//启动线程
t.start();
} public static void main(String[] args) {
init(new SleepMethodTest(),500,500);
}
//初始化程序界面方法
public static void init(JFrame frame,int width,int height){
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width,height);
frame.setVisible(true);
}
}
运行结果图

4、static关键字
一旦用了static关键字,那么这样的内容不再属于对象自己,而是属于类的,所有凡是本类的对象,都共享同一份。
package cn.intcast.demo13;
public class Student {
private String name; //姓名
private int age; //年龄
static String room; //static修饰的所在教室
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
Student类
package cn.intcast.demo13;
public class Code01Static {
public static void main(String[] args) {
Student one = new Student("梅超风",32);
System.out.println("姓名:"+one.getName()+";年龄:"+one.getAge());
Student two = new Student("黄老邪",64);
two.setName("王重阳");
two.setAge(44);
System.out.println("姓名:"+two.getName()+";年龄:"+two.getAge());
one.room = "404班";
System.out.println("第二个人的班级是:"+two.room);
}
}
运行结果图

5、若static修饰成员方法,那么该方法就是静态方法。静态方法不属于对象,而是属于类的。
如果没有static关键字,那么必须先创建对象,然后通过对象才能使用。对于静态方法来说,可以通过对象名进行调用,也可以直接通过类名称来调用。

package cn.intcast.demo13;
public class MyClass {
public void method(){
System.out.println("这是普通的成员方法");
}
public static void methodStatic(){
System.out.println("这是静态方法");
}
}
MyClass
package cn.intcast.demo13;
public class CodeStatic {
public static void main(String[] args) {
//首先创建对象
MyClass obj = new MyClass();
//然后才能使用没有static关键字的内容
obj.method();
//对于静态方法来说,可以通过对象名进行调用,也可以直接通过类名称来调用。
obj.methodStatic(); //正确,不推荐,这种写法在编译之后也会被javac翻译成为"类名称.静态方法名"
MyClass.methodStatic(); //正确,推荐
}
}
CodeStatic
运行结果图

6、静态static的内存图

7、静态代码块
格式:
public class 类名称{
static{
//静态代码块
}
}
特点:当第一次用到本类时,静态代码块执行唯一一次。
静态内容总是优先于非静态。所以静态代码块比构造方法先执行。
典型用途:用来一次性的对静态成员变量进行赋值
JAVA进阶13的更多相关文章
- Java 进阶 hello world! - 中级程序员之路
Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...
- Java进阶(三)多线程开发关键技术
原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...
- Java进阶(七)正确理解Thread Local的原理与适用场景
原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...
- Java进阶(三十二) HttpClient使用详解
Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...
- Java进阶(五十三)屡试不爽之正则表达式
Java进阶(五十三)屡试不爽之正则表达式 在线测试网址: http://tool.oschina.net/regex/# 上面的在线测试网址,含有正则表达式的生成,非常实用.大家共勉之! 匹配中文: ...
- Java进阶之路
Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...
- 7.19实习培训日志- java进阶
java进阶 java集合 Collection List ArrayList jdk1.2,异步处理,性能高,线程不安全 Vector jdk1.0,同步处理,性能低,线程安全 Set HashSe ...
- java进阶视频分享
更多资源和教程请关注公众号:非科班的科班. 如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力 课程目录介绍 01.开班仪式02.并发编程专题之多线程基础03.并发编程专题之Java内存模 ...
- 大型Java进阶专题(一) 前言
前言 各位读者好,本系列为Java进阶专题,为那些有一定工作经验,做了多年业务的码农,希望突破技术瓶颈,但没有形成系统的Java只是体系,缺乏清晰的提升方法和学习路径的人,比如作者本人.该课题的是 ...
随机推荐
- lsof -i
https://www.cnblogs.com/sparkbj/p/7161669.html 主要命令
- grep -v、-e、-E
在Linux的grep命令中如何使用OR,AND,NOT操作符呢? 其实,在grep命令中,有OR和NOT操作符的等价选项,但是并没有grep AND这种操作符.不过呢,可以使用patterns来模拟 ...
- redis分页
模仿的https://www.cnblogs.com/dee0912/p/4612183.html 第一步连接redis后进行添加数据 require_once '../redis/redis.php ...
- java 服务端I/O非阻塞实现05
/** * 非阻塞IO多线线程服务端 * 当一个任务进入多线程,这个任务线程需要处理接收信息.发送信息.因而发生I/O阻塞问题 * 利用selector可以实现异步 * */ public class ...
- Codeforces Round 1152 (div. 2)
奇差.ABC三题,排名400. 首先是策略问题. 由于第一眼看到D的时候感觉不太会做,于是去看E. 一看到E这不欧拉回路吗,可做可做, 于是--我不会欧拉回路! 手推.推了半天啥也没弄出来, 于是大概 ...
- opentack-openstack组件及功能(1)
一. OpenStack各组件间的关系 图22.1 OpenStack各组件间的关系 1.基础管理服务包含Keystone,Glance,Nova,Neutron,Horizon五个服务 (1)Key ...
- vue axios封装以及登录token过期跳转问题
Axios配置JWT/封装插件/发送表单数据 首先请务必已仔细阅读 Axios 文档并熟悉 JWT: 中文文档 JWT 中文文档 安装 npm install axios npm install es ...
- 关于token登录逻辑分析
前言: token登录上一家公司也写过,迷迷糊糊的, 现在做一个APP,需求为每次调用接口都会传token,登录注册等特殊的除外, 逻辑整理一下还是比较简单的 主要的问题还是,如何在框架中找到较好的插 ...
- FileZilla-02
WordPress的权限方案 通常,所有文件应由您的Web服务器上的用户(ftp)帐户拥有,并且应该可由该帐户写入.在共享主机上,文件永远不应归Web服务器进程本身所有(有时这是www,或apache ...
- BZOJ 1491: [NOI2007]社交网络(Floyd+暴力乱搞)
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1491 题解: 先看数据范围,n<=100..欸可以乱搞了 首先因为小学学过的乘法原理 ...