十一:IDEA的使用与多线程
ctrl+shift+t:查找类
ctrl+o:查找类中的方法
Alt+enter:可以修改错误
-
11.1
bin/idea64.exe.vmoptions下修改
IEDA工程:
输出是:sout+enter键或者(“HelloWorld ”).sout+enter键;main()方法是psvm;(可在“File“”setting”“live Tenplates”中更改)
Eclipse工程:
输出是:syso+alt+/;main()方法是main()+alt+/; -
11.2:Module(创建模块)
IDEA:Project和Module
Eclipse:Workspace和Project
创建:在“Project”下“new”“Module”
删除:“Remove Module”使其成为普通的文件,再右击“Delete” -
11.3多线程
-
如何创建多线程:
1:继承于Thread类
package Test01;
public class ThreadTest2 {
public static void main(String[] args) {
MyThread2 p2=new MyThread2();
MyThread3 p3=new MyThread3();
p2.start();
p3.start();
}
}
class MyThread2 extends Thread{
public void run(){
for(int i=0;i<100;i++){
if(i%2==0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
class MyThread3 extends Thread{
public void run(){
for(int i=0;i<100;i++){
if(i%2!=0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
因对象只使用一次,所以可以创建匿名子对象
new Thread(){
public void run(){
for(int i=0;i<100;i++){
if(i%2!=0)
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}.start();
Thread类的有关方法
调用set()和get()方法设置线程名字:
或者在构造其中设置线程名字:
释放当前cpu执行权
加入执行
睡眠
判断是否存活
- 线程的优先级
2:实现Runnable接口的类
public class WindowTest2 {
public static void main(String[] args) {
Window w=new Window ();
Thread t1=new Thread(w);//用的是public Thread(Runnable target){}构造器
Thread t2=new Thread(w);//t1和t2构造器中的w参数相同,则两者共享一个ticket
t1.setName("窗口1");
t2.setName("窗口2");
t1.start();
t2.start();
}
}
class Window implements Runnable{
private int ticket=100;//不用定义为static型
public void run(){
while(true){
if(ticket>0){
System.out.println(Thread.currentThread().getName()+":卖票,票号为:"+ticket);
ticket--;
}else{
break;
}
}}
}
主线程也就是用户线程;异常线程,垃圾回收线程属于守护线程
线程的生命周期
线程安全问题
- 同步代码块
同步代码块对继承:
同步代码块对实现:
同步监视器有三种:
1.对象:
2.this:是调用windows.run()的对象,只有一个
3.当前类:
同步方法:
同步方法对继承
同步方法对实现
Lock锁
Lock锁对实现:
- 死锁
- 线程通信
两个线程交替进行
sleep()和wait()相同点和区别
3.实现Callable接口
package Test03;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableTest {
public static void main(String[] args) {
//3.创建Callable接口实现类的对象
NumThread p=new NumThread();
//4.将次Callable接口实现类作为形参传递到FutherTask构造器中,创建FutherTask的对象中
FutureTask f=new FutureTask(p);
//5.将FutherTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并且调用start();
new Thread(f).start();
try {
//6.获取Callable中call方法的返回值
Object sum = f.get();
System.out.println("总和为:"+sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
//1.创建一个实现Callable的实现类
class NumThread implements Callable {
int sum=0;
//实现call方法,将此线程需要执行的操作声明在call()中
@Override
public Object call() throws Exception {
for(int i=1;i<100;i++){
if(i%2==0){
System.out.println(i);
sum+=i;
}}
return sum;//装箱将sum装换为类
}
}
```
4.使用线程池
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20190602160002928.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk2NjcxMg==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20190602155801401.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk2NjcxMg==,size_16,color_FFFFFF![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20190602155813109.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDk2NjcxMg==,size_16,color_FFFFFF,t_70)