线程:
1.线程并发:多个线程并发执行,提高软件运行效率。
2.main方法创建的线程称为主线程。
3.实现多线程的方法:
1.继承java.long.Thread类。
步骤:1.编写一个类,让该类继承java.long.Thread类。
2.重写run方法。
3.在main方法中创建该类的对象并运行其start方法。
注意:start方法只能调用该类的run方法,可将其他要运行的方法由run调用。
2.实现java.long.Runnable接口。
步骤:1.实现Runnable接口。
2.实现run方法。
3.创建Runnable对象以及线程对象,并调用start方法。
代码如下:
4.线程状态
1.初始状态:创建线程对象。
2.可运行状态:调用start方法。
3.运行状态:CPU执行该线程。
4.阻塞状态:该线程既不执行也不排队,时间到时唤醒,使用方法如下:
在Thread类下的void sleep(long time){}
5.终结状态:任务执行完毕。
5.线程同步
被多线程并发访问时如果一个对象有可能出现数据不一致的问题,那么这个对象称为线程不安全的对象,所以要用线程同步的方法解决该问题。
1.线程同步的方法:使用synchronized关键字:
2.线程控制:
Object类下的方法:
wait() 让当前对象放弃现有锁,进入阻塞。
notify() 唤醒刚才进入阻塞的线程。
notifyAll() 唤醒所有线程。
作业:
通过线程技术与流技术将D:\images目录下的所有图片复制到F:\images目录下,同时将这些图片名字修改为:原来名称_副本.后缀
参考答案(主要代码):
public class LX {
public static void main(String[] args) throws IOException {
File f = new File("d:/images");
File[] sf = f.listFiles();
for (int i = 0; i < sf.length; i++) {
copy cc= new copy();
cc.getfc(sf[i]);
cc.start();
}
}
}
class copy extends Thread{
File fc;
public File getfc(File fc) {
this.fc = fc;
return fc;
}
public void run() {
File d = new File("e:/images", getfc(fc).getName().replace(".", "_附件."));
try {
FileInputStream fd = new FileInputStream(getfc(fc));
FileOutputStream fe = new FileOutputStream(d);
int ii = fd.read();
while (ii != -1) {
fe.write(ii);
ii = fd.read();
}
fe.close();
fd.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
File f = new File("d:/images");
File[] sf = f.listFiles();
for (int i = 0; i < sf.length; i++) {
copy cc= new copy();
cc.getfc(sf[i]);
cc.start();
}
}
}
class copy extends Thread{
File fc;
public File getfc(File fc) {
this.fc = fc;
return fc;
}
public void run() {
File d = new File("e:/images", getfc(fc).getName().replace(".", "_附件."));
try {
FileInputStream fd = new FileInputStream(getfc(fc));
FileOutputStream fe = new FileOutputStream(d);
int ii = fd.read();
while (ii != -1) {
fe.write(ii);
ii = fd.read();
}
fe.close();
fd.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}