间歇性混吃等死,持续性踌躇满志系列-------------第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的更多相关文章

  1. Java 进阶 hello world! - 中级程序员之路

    Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...

  2. Java进阶(三)多线程开发关键技术

    原创文章,同步发自作者个人博客,转载请务必以超链接形式在文章开头处注明出处http://www.jasongj.com/java/multi_thread/. sleep和wait到底什么区别 其实这 ...

  3. Java进阶(七)正确理解Thread Local的原理与适用场景

    原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...

  4. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  5. Java进阶(五十三)屡试不爽之正则表达式

    Java进阶(五十三)屡试不爽之正则表达式 在线测试网址: http://tool.oschina.net/regex/# 上面的在线测试网址,含有正则表达式的生成,非常实用.大家共勉之! 匹配中文: ...

  6. Java进阶之路

    Java进阶之路——从初级程序员到架构师,从小工到专家. 怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序 ...

  7. 7.19实习培训日志- java进阶

    java进阶 java集合 Collection List ArrayList jdk1.2,异步处理,性能高,线程不安全 Vector jdk1.0,同步处理,性能低,线程安全 Set HashSe ...

  8. java进阶视频分享

    更多资源和教程请关注公众号:非科班的科班. 如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力 课程目录介绍 01.开班仪式02.并发编程专题之多线程基础03.并发编程专题之Java内存模 ...

  9. 大型Java进阶专题(一) 前言

    前言 ​ 各位读者好,本系列为Java进阶专题,为那些有一定工作经验,做了多年业务的码农,希望突破技术瓶颈,但没有形成系统的Java只是体系,缺乏清晰的提升方法和学习路径的人,比如作者本人.该课题的是 ...

随机推荐

  1. Linux-基础学习(二)-基本部署

    开始今日份整理 1. 系统优化部分 1.1 Linux防火墙安全相关(重要) 1.1.1 SELinux功能 SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA ...

  2. Java Scanner用法详解

    一.Scanner类简介 Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序.它是以前的StringTokenizer和Matcher类之间的某种结合.由于 ...

  3. 我遇到的response.sendRedirect跳转不了问题

    response.sendRedirect不跳转的原因可以归纳为(其中第三点是我遇到的问题): 前人经验: 在使用response.sendRedirect时,前面不能有HTML输出: 在respon ...

  4. 《Effective C++》实现:条款26-条款31

    条款26:尽可能延后变量定义式的出现时间 C++推荐在使用对象前才定义对象(调用构造函数赋初值) 只在循环中使用的变量定义在循环内部(除非"赋值"成本低于"构造+析构&q ...

  5. centos django Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING

    os环境 centos python2.7.5 django1.10.8 class AdminAutoRunTask(View): """ 自动跑外放任务 " ...

  6. javaWeb1之Servlet

    Servlet Servlet 环境设置 servlet是扩展web服务器功能的组件规范.浏览器发送请求给web服务器,如果是动态资源的请求,web服务器会将请求转发给servlet容器来处理(由容器 ...

  7. 使用System.out.printf()输出日志重定向到文件后显示混乱问题

    写了一个小工具,使用System.out.printf()输出日志,以方便使用者查看,在终端显示没有问题,但重定向到文件就有问题了,会出现一些很奇怪的乱序现象. 上网查询资料,判断应该是跟重定向和Li ...

  8. Redis DeskTop Manager 使用教程

    redis desktop manager windows 是一款能够跨平台使用的开源性redis可视化工具. redis desktop manager主要针对redis开发设计,拥有直观强大的可视 ...

  9. Vivado2016旧工程IP移动到新工程

    前言 在VIVADO中图形化界面生成IP,在旧工程中使用后,如果想在新的工程中使用这个IP但又不想再次生成一次,则就需要把就旧工程中的IP导入到新工程中. 流程 1.旧工程IP生成的目录如下,IP为C ...

  10. luogu P2617 Dynamic Rankings && bzoj 1901 (带修改区间第k大)

    链接:https://www.luogu.org/problemnew/show/P2617 思路: 如果直接在主席树上修改的话,每次修改都会对后面所有的树造成影响,一次修改的复杂度就会变成 : n* ...