首先是进程和线程的区别,进程就是像打开csgo.exe就是一个进程,然后打开LOL.exe又是另外一个进程了。
而线程呢,就是在同一进程内部,发生的事情。
那么就开始了解线程!
创建多线程:
线程有三种创建方法:
1.继承Thread类的方式
public class Testthread extends Thread{
public void run(){
//
}
}
run方法里面就是写你这个线程要做的事情。
然后:
TestThread t1=new TestThread();
t1.start();
通过.start()方法就可以开始t1这个线程啦!
2.实现Runnable的方式
public class ttt implements Runnable{
public void run(){
}
}
然后:
ttt t2 = new ttt();
new Thread(t2).start();
就可以开始t2这个线程啦,需要注意的同样也是要有.start()才能运行这个线程。
3.匿名类的方式
这也是我喜欢的方式,因为写起来简单hhhh
Thread t3 = new Thread() {
public void run()
{
//
}
};
同样的要注意:启动线程是start()方法,run()并不能启动一个新的线程。
常见的线程方法:
1、暂停当前线程: .sleep()
顾名思义,把当前的线程暂停一定时间,其他的线程并不会受到影响。
注意是会抛出interruptedException异常的。
2、加入到当前线程中: .join()
join的作用是当这个线程运行完事儿之后程序才继续往下走,不然会一直停在join方法处。
使用场景:如果在某处后边的处理需要使用到t1的数据,那么可以用join来等待t1线程执行结束。
3、定义线程的优先级: .setPriority()
当线程处于竞争关系的时候,优先级高的线程会获得更多的cup资源,也就是这个线程会执行得更快
4、临时暂停: .yield
并不是直接就给它停住了,而是它自己也在慢慢运行,但是会把更多的cup资源让给其他的线程。
5、守护线程: .setDaemon(true)
守护线程的概念是: 当一个进程里,所有的线程都是守护线程的时候,结束当前进程。
就是说可以用来把一些辅助线程写成守护的,那么当干实事的线程完事了,这些守护的线程就没必要继续了。
比如写日志啊,性能统计等。
作业1、波动拳:
package Multiplethread;
/*
英雄有可以放一个技能叫做: 波动拳-a du gen。
每隔一秒钟,可以发一次,但是只能连续发3次。
发完3次之后,需要充能5秒钟,充满,再继续发。
借助本章节学习到的知识点,实现这个效果
*/
public class Test1_adugen {
public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
for(int i = 0;i < 5;i ++)
{
for(int j = 0;j < 3;j ++) {
System.out.println("正在发送第"+(j+1)+"波动拳");
try {
Thread.sleep(1000);
}catch(InterruptedException e ) {
e.printStackTrace();
}
}
System.out.println("开始为时5s的充能");
try {
Thread.sleep(5000);
}catch(InterruptedException e ) {
e.printStackTrace();
}
}
}
};
t1.start();
}
}
作业2:破解密码
package Multiplethread;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 1. 生成一个长度是3的随机字符串,把这个字符串当作 密码
* 2. 创建一个破解线程,使用穷举法,匹配这个密码
* 3. 创建一个日志线程,打印都用过哪些字符串去匹配,这个日志线程设计为守护线程
* 提示: 破解线程把穷举法生成的可能密码放在一个容器中,日志线程不断的从这个容器中拿出可能密码,并打印出来。
* 如果发现容器是空的,就休息1秒,如果发现不是空的,就不停的取出,并打印。
*/
public class text_mima {
public static void main(String[] args) {
Random r = new Random();
String targetstr="";
List<String> l = new ArrayList<String>();
for(int i = 0;i < 3;i ++)//随机目标字符串
{
while(true)
{
char x = (char)r.nextInt(122);
if(Character.isDigit(x) || Character.isAlphabetic(x))
{
targetstr+=x;
break;
}
}
}
//System.out.println(targetstr);
Thread t1 = new Thread() {
public void run() {
for(char i = '0';i <= 'z';i ++)
{
if(Character.isDigit(i) || Character.isAlphabetic(i))
{
for(char j = '0';j <= 'z';j ++)
{
if(Character.isDigit(j) || Character.isAlphabetic(j))
{
for(char k = '0';k <= 'z';k ++)
{
if(Character.isDigit(k) || Character.isAlphabetic(k))
{
StringBuffer buf = new StringBuffer();
buf.append(i);
buf.append(j);
buf.append(k);
l.add(buf.toString());
System.out.println("产生的新密码是:"+buf.toString());
}
}
}
}
}
}
}
};
t1.start();
Thread t2 = new Thread(){
public void run() {
while(true) {
if(l.isEmpty())
{
try {
Thread.sleep(1000);
}catch(InterruptedException e)
{
e.printStackTrace();
}
continue;
}
for(int i = 0;i < l.size();i ++)
{
File f = new File("C:/Users/msi-/Desktop/mim.txt");
try(FileWriter fr = new FileWriter(f,true)
){
fr.write(l.get(i));
System.out.println("记录的密码是:"+l.get(i));
}catch(IOException e)
{
e.printStackTrace();
}
}
}
}
};
t2.setDaemon(true);
t2.start();
}
}