当有线程正在读的时候,不允许写 线程写,但是允许其他的读线程进行读。有写线程正在写的时候,其他的线程不应该读写。为了防止写线程出现饥饿现象,当线程正在读,如果写线程请求写,那么应该禁止再来的读线程进行读。
实现代码如下:
File.Java
1
2
3
4
5
6
7
8
9
10
|
package readerWriter; public class File { private String name; public File(String name) { this .name=name; } } |
Pool.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package readerWriter; public class Pool { private int readerNumber= 0 ; private int writerNumber= 0 ; private boolean waittingWriten; public boolean isWaittingWriten() { return waittingWriten; } public void setWaittingWriten( boolean waittingWriten) { this .waittingWriten = waittingWriten; } public File getFile() { return file; } public void setFile(File file) { this .file = file; } File file; public Pool(File file) { this .file=file; } public int getReaderNumber() { return readerNumber; } public void setReaderNumber( int readerNumber) { this .readerNumber = readerNumber; } public int getWriterNumber() { return writerNumber; } public void setWriterNumber( int writerNumber) { this .writerNumber = writerNumber; } } |
Reader.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
package readerWriter; public class Reader implements Runnable{ private String id; private Pool pool; public Reader(String id,Pool pool) { this .id=id; this .pool=pool; } @Override public void run() { // TODO Auto-generated method stub while (!Thread.currentThread().interrupted()){ synchronized (pool){ while (pool.getWriterNumber()> 0 || pool.isWaittingWriten()== true ) //当线程正在写或者 //有线程正在等待写,则禁止读线程继续读 { try { pool.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } { pool.setReaderNumber(pool.getReaderNumber()+ 1 ); } } System.out.println(id+ " " + "is reading...." ); try { Thread.sleep( 1000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized (pool) { pool.setReaderNumber(pool.getReaderNumber()- 1 ); System.out.println(id+ " " + "is existing the reader...." ); if (pool.getReaderNumber()== 0 ) pool.notifyAll(); } try { Thread.sleep( 1000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // pool.notifyAll(); } } } |
Writer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
package readerWriter; public class Writer implements Runnable{ private Pool pool; String id; public Writer(String id,Pool pool) { this .id=id; this .pool=pool; } @Override public void run() { // TODO Auto-generated method stub while (!Thread.currentThread().interrupted()){ synchronized (pool){ if (pool.getReaderNumber()> 0 ) pool.setWaittingWriten( true ); else pool.setWaittingWriten( false ); //当线程正在被读或者被写或者有线程等待读 while (pool.getWriterNumber()> 0 || pool.getReaderNumber()> 0 ) { try { pool.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } pool.setWaittingWriten( false ); //这个策略还算公平 { pool.setWriterNumber(pool.getWriterNumber()+ 1 ); } } System.out.println(id+ " " + "is writing...." ); try { Thread.sleep( 1000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // synchronized (pool) { pool.setWriterNumber(pool.getWriterNumber()- 1 ); System.out.println(id+ " " + "is existing the writer...." ); pool.notifyAll(); } /* try { Thread.sleep(1000); //System.out.println("writer sleeping over"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } */ } } } |
Main.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package readerWriter; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Pool pool= new Pool( new File( "dd file" )); for ( int i= 0 ;i< 2 ;i++) { Thread writer= new Thread( new Writer( "writer " +i,pool)); writer.start(); } for ( int i= 0 ;i< 5 ;i++) { Thread reader= new Thread( new Reader( "reader " +i,pool)); reader.start(); } } } |
程序部分运行结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... reader 0 is reading.... reader 0 is existing the reader.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... reader 3 is reading.... reader 2 is reading.... reader 4 is reading.... reader 1 is reading.... reader 0 is reading.... reader 3 is existing the reader.... reader 1 is existing the reader.... reader 0 is existing the reader.... reader 4 is existing the reader.... reader 2 is existing the reader.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... reader 2 is reading.... reader 2 is existing the reader.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... |
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://blog.csdn.net/m1457285665/article/details/44501339