线程

1、实现线程的两个方法

public class ThreadTest {

	public static void main(String[] args) {
		Thread1 t1 = new Thread1();
		t1.start();
	}
}
class Thread1 extends Thread{
	public void run() {
		for(int i=0; i<100; i++){
			System.out.println(i);
		}
	}
}
public class ThreadTest1 {
	public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable(){
			public void run() {
				for(int i=0; i<100; i++)
					System.out.println(i);
			}
		});
		t1.start();
	}
}

2、两种生成线程方法的区别:当使用继承来生成线程对象是地,需要重写run方法,因为Thread类的run方法此时什么事情也不做。target是空的。

当使用接口的方式来生成线程对象时,需要实现Runnable接口的run方法。然后new Thread(new MyThread())来生成线程对象,这时的线程对象的run方法就会调用MyThread类的run方法,这样我们自已编写run方法执行了。

public void run() {
    if (target != null) {
        target.run();
    }
}
public Thread() {
    init(null, null, "Thread-" + nextThreadNum(), 0);
}
    private void init(ThreadGroup g, Runnable target, String name,
                      long stackSize) {
    }

3、Thread源码解析

(1)、Thread类也实现了Runnable接口,因此实现了Runnable接口中的run方法

public
class Thread implements Runnable {

(2)、当生成一个线程对象时,如果没有为其设定名字,那么线程对象的名字将使用如下形式:Thread-number,该number是自动增加的,并被所有的Thread对象所共享,因为它是static的成员变量。

public Thread() {
    init(null, null, "Thread-" + nextThreadNum(), 0);
}

4、线程的消亡不能通过调用一个stop命令,而是让run方法自然结束。

private boolean flag = true;
public void run(){
	while(flag){
	  ...	
	}
}
public void stopRunning(){
	flag = false;
}

5、线程的生命周期:一个线程从创建到消亡的过程。

经程的生命周期可分为四个状态:

(1)创建设状态

当用new操作符创建一个新的线程对象时,该线程处于创建状态,处于创建状态的线程只是一个空的线程对象,系统不为它分配资源。

(2)可运行状态

执行线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体run方法,这样就使得该线程处于可运行状态。

(3)不可运行状态

当发生下列事件时,处于运行状态的线程会转入不可运行状态

a.调用了sleep()方法;

b.线程调用了wait方法等待特定条件的满足

c.线程输入/输出阴塞

返回可运行状态

a.处理睡眠状态的线程在指定的时间过去后

b.如果线程在等待某一条件,另一对象必须通过notify()或notifyAll()方法通知等待线程条件的改变

c.如果线程是因为输入/输出阻塞,等待输入/输出完成

(4)消亡状态

当线程的run方法执行结束后,该线程自然消亡

6、关于成员变量与局部变量,如果一个变量是成员变量,多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程)。

如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影响到其他线程。

7、停止线程的方式:不能使用Thread类的stop方法来终止线程的运行。一般要设定一个变量,在run方法中是一个循环,循环每次检查该变量,如果满足条件则继续执行,否则跳出循环,线程结束。

8、为什么要引入同步机制

在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源。必须对这种潜在资源冲突进行预防。

解决方法:在线程使用一个资源时为其加锁即可。访问资源的每一个线程为其加上锁后,其他线程便不能再使用那个资源,除非被解锁。

9、当synchronized关键字修饰一个方法时,该方法叫同步方法。

10、Java中的每个对象都有一个锁(lock)或者叫监视器(monitor),当访问某个对象的synchronized方法时,表示该对象上锁,此时其他任何线程都无法再去访问该synchronized方法了,直到之前的那个线程执行完毕后(或是抛出了异常),那么该对象的锁释放掉,其他线程才有可能再去访问该synchronized方法。

11、如果一个对象有多个synchronized方法,某一时刻某个线程已经进入某个synchronized方法,那么在该方法没有执行完毕前,其他线程是无法访问该对象的任何synchronized方法的。

12、如果某个synchronized方法是static的,当线程访问该方法是地,它锁的不是synchronized方法所在的对象,而是synchronized方法所在的对象所对应的Class对象,因为Java中无论一个类有多少个对象,这些对象会对应一个Class对象,因此当线程分别访问同一个类的两个对象的两个static ,synchronized方法,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。

13、synchronized块,写法

synchronized(object){

}
表示线程在执行的时候会对object对象上锁。

14、synchronized方法是一种粗粒度的并发控制,某一时刻只有一个线程执行该synchronized方法;synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内、synchronized块之外的代码是可以被多个线程同时访问到的。



资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 在 Linux 系统中,查找域名或主机名对应的 IP 地址是网络管理中的一项基础且关键任务,对于排查网络故障、调试网络问题以及监控网络服务是否正常运行等场景都非常重要。本文将介绍五种在 Linux 终端查询域名 IP 地址的方法。 首先,dig 命令(全称 Domain Information Groper)是一个功能强大的 DNS 查询工具,能够向 DNS 服务器发送查询请求并获取详细的响应信息。如果需要查询单个域名的 IP 地址,可以使用命令 dig 2daygeek.com +short 。此外,还可以通过编写 bash 脚本,将包含域名的文本文件中的域名逐个读取,然后利用 dig 命令进行查询,从而实现批量查询域名 IP 地址的功能。 其次,host 命令是一个简单易用的 DNS 查询工具,主要用于将域名解析为 IP 地址。要获取某个域名的 IP 地址,直接使用 host 2daygeek.com 即可。如果只想显示 IP 地址部分,可以通过管道结合 grep 和 sed 命令来实现,例如:host 2daygeek.com | grep "has address" | sed s/has address/-/g 。 再者,nslookup 命令也是一种常用的 DNS 查询工具,它支持交互式查询 DNS 信息。通过 nslookup 2daygeek.com 可以查询域名的 IP 地址。若要以非交互式的方式只显示 IP 地址,可以使用命令 nslookup 2daygeek.com | awk /^Address:/ {print $2} 。 另外,fping 命令与传统的 ping 命令不同,它不会直接进行 DNS 查询,而是通过发送 ICMP Echo Request(pi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值